我想得到洛杉矶的时区信息,现在10/10/2017是夏令时,但是当我用两种方式得到洛杉矶的时区时,我得到了不同的结果。
public class TimeZoneDemo2 {
public static void main(String[] args) {
TimeZone timeZoneLosAngeles =
TimeZone.getTimeZone("America/Los_Angeles");
System.out.println(timeZoneLosAngeles);
TimeZone timeZoneGmtMinus07 = TimeZone.getTimeZone("GMT-07:00");
System.out.println(timeZoneGmtMinus07);
}
}
结果是:
太阳util。日历ZoneInfo[id=“America/Los_Angeles”,offset=-2880000,dstSaves=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-2880000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDayOfWeek=8,startDayOfWeek=1,StartDayMemode=7200000,TimeMode=3,endMonth=10]
太阳util。日历ZoneInfo[id=“GMT-07:00”,偏移量=-25200000,dststavings=0,useDaylight=false,transitions=0,lastRule=null]
我的问题是:“美国/Los_Angeles”获得的时区信息中有关夏令时的信息。为什么不在“格林威治标准时间-0700”获得的时区信息中包含夏令时信息(useDaylight=false)?
Jon Skeet的回答是正确的,应该被接受。您无法根据与UTC的偏移量可靠地确定时区,因为许多区域可能会同时共享一个偏移量。此外,分区的偏移可能会随时间而变化。
下面是一些代码示例,它们使用比问题中看到的更现代的类来解决这个问题。
您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java所取代。时间课。
正如其他人所说,如果您知道预期的时区,请始终优先使用该时区,而不是仅仅从UTC偏移。偏移量只是比UTC提前或落后数小时、分钟和秒。时区是一个地区的人们使用的偏移量的变化历史。时区知道偏移量变化的过去、现在和(暂时)未来。
ZoneId
和ZoneOffset
类替换TimeZone
。
以大陆/地区
的格式指定适当的时区名称,例如美国/蒙特利尔
,非洲/卡萨布兰卡
,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ; // Or "Africa/Tunis", "Pacific/Auckland", etc.
通过该区域的镜头获取当前时刻。
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Fetch current moment for that zone.
提取同一时刻,但调整为UTC。
Instant instant = zdt.toInstant() ; // Extract the same moment but in UTC.
将这一时刻调整到另一个区域。
ZonedDateTime zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) ) ; // Determine same moment, same point on timeline, but in another time zone.
所有这三个对象都代表时间线上相同的同时点,但以不同的挂钟时间观看。
看看那个地区的人们当时使用的偏移量。
ZoneOffset offset = z.getRules().getOffset( instant ) ; // Get the offset in place at that moment for that time zone.
您会发现,在2018年的部分时间里,America/Los_Angeles
的偏移量将是-07:00
(比UTC晚几个小时)。在一年的另一部分,偏移量将是-08:00
(比UTC晚八个小时)。偏移量的这种变化是由于政治家决定遵守夏令时(DST)。
java.timehtml" target="_blank">框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.Date
,Calendar
,
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。
从哪里获得java.time课程?
Three10-Extra项目通过附加类扩展java.time。该项目是未来可能添加到java.time.的试验场。您可以在此处找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
等。
我想得到洛杉矶的时区信息,现在10/10/2017是夏令时
所以你应该申请“美国/洛杉矶”区域。这就是它的目的。
“GMT-07:00”区域是一个固定的偏移区域——仅当您想要表示“一个永远落后于UTC七小时的时区”时才适用。这不适用于洛杉矶。
还有很多其他时区有时是UTC-7——为什么你认为GMT-07:00的意思是“在洛杉矶观察到的时区”?
换句话说,Java正在做正确的事情——你对“GMT-07:00”区域的预期是错误的。
结果是: sun.util.calendar.zoneinfo[id=“America/Los_Angeles”,offset=-28800000,dstsavings=3600000,usedaylight=true,transitions=185,lastrule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,
问题内容: 这是我需要处理的日期格式 但是我不了解最后两个部分。是固定的吗?应该是这样吗? 问题答案: 不,它不是固定的。这是一个时区。您可以将其与日期格式匹配。 更准确地说,采用SimpleDateFormat格式: 匹配零件。 是固定的。用一些引号将其转义。 z匹配部分。(PDT =太平洋夏令时间)。 PDT周围的括号是固定的。用括号将其转义。 您可以使用以下格式解析日期: 另一个要点 :包含
但我不明白最后两个部分是什么。是否已修复?应该是这样的吗?
问题内容: 苹果使用Etc / GMT时区的原因是什么,当苹果从App Store返回收据以进行自动续订时,该理由是什么。 Etc / GMT时区到底是什么时间?Java SDK是否了解该时区?还是我必须使用其他第三方库(如Joda- Time) ? 问题答案: Etc / GMT 与UTC或GMT 并不 完全相同。仅当偏移量为0时,它们表示时间上的同一时刻。在所有其他情况下,它们是完全不同的。
问题内容: 无论计算机上设置的时区如何,我都需要对GMT / UTC进行任何与时间相关的操作。在代码中有任何方便的方法吗? 为了明确起见,我将所有操作都使用数据库服务器时间,但是它是根据本地时区格式化的。 谢谢! 问题答案: OP回答了这个问题,以更改正在运行的JVM的单个实例的默认时区,并设置系统属性: 如果从数据库检索Date / Time / Timestamp对象时需要设置特定的时区,请使
与许多Web应用程序一样,我正在开发的应用程序需要为我们亲爱的最终用户转换时区。然而,当我在PHP 5.3中使用Carbon/DateTime时,我发现这很奇怪: 我将的时区设置为GMT 5,但是当我格式化时,它变成,而不是预期的。 同样,如果我将其设置为负数,即,则格式显示而不是预期的。 有人能开导吗? 我能够在PHP5.3.3、5.3.13、5.3.28中复制这个问题。认为这是一个PHP特定的