在Java中将EST转换为EDT或反之亦然

时间:2012-03-22 17:12:24

标签: java calendar timezone

任何人都可以讲三件事:

  1. 如何从java.util.Date实例中检索TimeZone?
  2. 如何知道夏令时是否适用?
    我想我可以通过timeZone.getDSTSavings来了解它,但我面临的问题是,即使我的系统日期是2012年2月1日,我仍然是获得积极的价值(我猜3600000)
  3. 如何将EST时间转换为EDT,反之亦然?

4 个答案:

答案 0 :(得分:6)

  

如何从java.util.Date实例中检索TimeZone?

没有这样的事情。 Date 只是表示自Unix时代以来的数毫秒,即1970年1月1日午夜。它与特定的日历系统或时区无关。换句话说,如果一个朋友和我在一起打电话(零延迟;)并且我点击我的手指,我们都会同意Date点击该位置的地方 - 即使我我正在使用格里高利历,他正在使用朱利安历法,即使我在伦敦,而且他在纽约。它与即时相同

  

如何知道夏令时是否适用?我想我可以通过执行timeZone.getDSTSavings来了解它,但我面临的问题是,即使我将系统的日期设为2012年2月1日,我仍然可以获得价值积极的(我猜3600000)

理想情况下,使用Joda Time代替java.util.Date / Calendar / TimeZone,但在TimeZone内您可以使用TimeZone.getOffset(long)查找偏移量来自UTC,或TimeZone.inDaylightTime(Date)只是给你一个是/否答案。

  

如何将EST时间转换为EDT,反之亦然?

通常这是一个无效的问题 - 因为在任何一个实例中, EST EDT都适用。您通常会从一个时区转换为另一个时区,而“EDT”和“EST”不是不同的时区 - 它们是相同时区内的不同偏移量。您要求这样做的事实表明您可能错误地建模您的数据以开始(不幸的是,日期/时间值很容易)。请提供更多信息,我们可以为您提供更多帮助。

答案 1 :(得分:0)

日期存储自1970年代以来的时间(以毫秒为单位),因此不包含时区信息。您的JVM有一个语言环境集,用于定义如何显示此日期。

如果您想了解您的JVM设置的TimeZone,请调用'TimeZone.getDefault()'

拥有TimeZone对象后,您可以调用多个函数来确定该时区是否将夏令时应用于给定日期:

  • inDaylightTime(日期)

To(粗略地)确定两个时区之间的差异:

long edtOffset = TimeZone.getTimeZone("EDT").getOffset(date.getTime());
long estOffset = TimeZone.getTimeZone("EST").getOffset(date.getTime());
long diff = estOffset - edtOffset;

虽然我不确定这是多么有效,因为EST和EDT是互斥的,上面的代码是否会给你感兴趣的结果(我没有测试过)

答案 2 :(得分:0)

  
      
  1. 如何从java.util.Date实例中检索TimeZone?
  2.   

您可以通过以toString()格式查看实例化日期对象的时区来查看它。例如“Wed May 01 12:00:00 EDT 2013”​​。

  

如何知道夏令时是否适用?我想我可以通过执行timeZone.getDSTSavings来了解它,但我面临的问题是,即使我将系统的日期设为2012年2月1日,我仍然可以获得价值为正(我猜3600000)3。如何将EST时间转换为EDT,反之亦然?这是我的关键问题

Date对象将自动计入EDT / EST。例如,如果你有11月28日的实例化Date对象,那么toString()将包括EST而不是EDT。

我最初遇到的问题是我试图将EST用于日光节约时间处于活动状态的日历日期,而Date对象通过在我的时间中添加一小时并显示EDT来自动纠正我的错误。

答案 3 :(得分:0)

我遇到了类似的问题。以下解决方案在Matlab中但是调用Java,我的更改只是注释,因为我正在使用Matlab datenum值。您实际上无法转换时区感知值,因为它们是相同的时区,但这可能有助于处理非时区感知的原始值。

%c1 GregorianCalendar of now
%c2 GregorianCalendar of date in question
tz1 = c1.getTimeZone; %Note t2 would be the same

in1 = tz1.inDaylightTime(c1.getTime);
in2 = tz1.inDaylightTime(c2.getTime);

if (in1 == in2)
    %do nothing
elseif in1
    %c1 EDT, c2 is EST
    %Subtract 1 hour to c2
else
    %c1 EST, c2 EDT
    %Add 1 hour to c2
end