【问题标题】:Converting EST to EDT or vice versa in Java在 Java 中将 EST 转换为 EDT 或反之亦然
【发布时间】:2012-03-22 17:12:23
【问题描述】:

谁能说说三件事:

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

【问题讨论】:

标签: java calendar timezone


【解决方案1】:

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

没有这样的事情。 Date just 表示自 Unix 纪元(UTC 时间 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”不是不同的时区——它们是相同时区内的不同偏移量。您要求这样做的事实表明,您可能一开始就错误地对数据进行建模(不幸的是,这对于日期/时间值很容易做到)。请向我们提供更多信息,我们或许可以为您提供更多帮助。

【讨论】:

  • 我们在数据库中存储了一个时间,该时间可以在 EDT 或 EST 中(取决于插入时间)。现在在查看时间时,应根据当前日期和时间将存储的时间转换为适用的 EST 或 EDT,这可能吗
  • @Guarav:目前还不清楚您实际上存储了什么。如果是本地时间,那么您可能已经丢失了信息 - 因为在夏令时转换期间,当时钟返回时,相同的本地时间会出现两次。您使用的是什么数据库,列是什么类型,以及为什么要存储当地时间?另外,您确定它取决于插入时间而不是值本身吗? (前者会真的奇怪...)
  • 数据库是sybase,字段类型是datetime,其实datetime字段中存储的值就是当前的日期时间。换句话说,我们将当前日期和时间保存在数据库中。现在过了一段时间,比如几个月后,当夏令时开始适用时,用户查看记录,那么保存的值应该格式化为 EST/EDT 仅供查看
  • @Guarav:但大概你想应用当时而不是现在适用的相同EST/EDT?不应仅仅因为 现在... 是夏季时间,就将冬季的当地时间显示为夏季时间
【解决方案2】:

日期以毫秒为单位存储自 1970 年以来的时间,因此不包含时区信息。您的 JVM 有一个语言环境集,它定义了该日期的显示方式。

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

一旦有了 TimeZone 对象,您就可以调用许多函数来确定对于该时区,夏令时是否适用于给定日期:

  • 夏令时(日期)

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

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

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

【讨论】:

  • 计算结果为-18000000,这应该是3600000。另外,当我在eclipse中调试时,检查TimeZone.getTimeZone(“EDT”)给出以下信息,请注意id为GMT ,这似乎很奇怪: sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],我相信 getTimeZone("EDT") 可能效果不好,可能是因为正如 Jon 已经指出的那样,EST 和 EDT 不是不同的时区。任何cmets
【解决方案3】:
  1. 如何从 java.util.Date 实例中检索 TimeZone?

您可以通过以 toString() 格式查看实例化的 Date 对象的时区。例如“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 来自动纠正我的错误。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题。以下解决方案在 Matlab 中但调用 Java,我的更改只是 cmets,因为我正在使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多