【问题标题】:Using Joda time to get current wall time for a given Time Zone使用 Joda 时间获取给定时区的当前挂钟时间
【发布时间】:2012-02-29 08:49:13
【问题描述】:

要求只是获取给定时区的当前挂钟时间(包括正确的 DST 调整)。

在 SO 中似乎有一些问题围绕着这个问题徘徊,但我似乎无法以低摩擦的方式找到一个直接的答案(在 SO、Joda doco 或谷歌搜索中)。似乎对于给定的输入(当前 UTC 时间和所需的 TZ),我应该能够从 Joda Time 库中链接几个方法来实现我想要的,但在上述示例中似乎希望评估 + 处理偏移量/应用程序代码中的转换——如果可能的话,我想避免这种情况,并根据其可用的静态 TZ 规则集尽最大努力使用 Jodas。

出于这个问题的目的,假设我不会使用任何其他第三方服务(基于网络或其他二进制文件),这只是 JDK 和 JodaTime 库中提供的服务。

任何指针表示赞赏。

更新: 这实际上是我的失误。我有一个基于请求经度的计算的 UTC 偏移量,虽然这显然有效,但您仍然需要区域信息才能获得正确的 DST 调整..

double aucklandLatitude = 174.730423;
int utcOffset = (int) Math.round((aucklandLatitude * DateTimeConstants.HOURS_PER_DAY) / 360);
System.out.println("Offset: " + utcOffset);

DateTimeZone calculatedDateTimeZone = DateTimeZone.forOffsetHours(utcOffset);
System.out.println("Calculated DTZ: " + calculatedDateTimeZone);
System.out.println("Calculated Date: " + new DateTime(calculatedDateTimeZone));
System.out.println();
DateTimeZone aucklandDateTimeZone = DateTimeZone.forID("Pacific/Auckland");
System.out.println("Auckland DTZ: " +  aucklandDateTimeZone);
System.out.println("Auckland Date: " + new DateTime(aucklandDateTimeZone));

打印

Offset: 12
Calculated DTZ: +12:00
Calculated Date: 2012-02-08T11:20:04.741+12:00

Auckland DTZ: Pacific/Auckland
Auckland Date: 2012-02-08T12:20:04.803+13:00

所以在阳光明媚的Auckland, NZ 我们是 +12,但在 DST 期间是 +13。

我的错。尽管如此,还是感谢您的回答,让我看到了我的错误。

【问题讨论】:

    标签: java timezone jodatime


    【解决方案1】:

    你看过DateTime构造函数吗:

    DateTime(DateTimeZone zone) 
    

    这会构造一个表示指定时区中当前时间的 DateTime。

    【讨论】:

    • 我更喜欢DateTime.now(DateTimeZone zone),因为我觉得它更明显。
    • 顺便调整时区调用withZone( myTimeZone )
    【解决方案2】:

    怎么样:

    DateTime utc = new DateTime(DateTimeZone.UTC);
    DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
    DateTime losAngelesDateTime = utc.toDateTime(tz);
    

    【讨论】:

    • 正确,但有两个问题。 (A) 无需传递当前时间的毫秒数,Joda-Time 会在内部为您执行此操作。该参数适用于您的代码经过毫秒计数时的转换。 (B) 'local' 是一个糟糕的 var 名称选择,因为它与 LocalDate 混淆,这意味着没有时区。
    • .forId 应该是 .forID,顺便说一下。
    【解决方案3】:

    最干净的方法

    我发现以下是最干净的方法。

    DateTime currentTime = DateTime.now( DateTimeZone.UTC );
    

    这将为您提供 UTC 中的当前时间,但此值可以转换为另一个 DateTimeZone,或者您可以将 DateTimeZone.UTC 替换为不同的 DateTimeZone

    使用系统时区

    如果要设置为系统时区,可以这样:

    DateTime currentTime = DateTime.now( DateTimeZone.getDefault() );
    

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2017-04-30
      • 2017-09-18
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2013-12-20
      • 2011-07-08
      相关资源
      最近更新 更多