当前位置: 首页 > 面试题库 >

JodaTime-如何获取UTC的当前时间

司寇照
2023-03-14
问题内容

我想获取UTC的当前时间。我到目前为止所做的是(仅出于测试目的):

    DateTime dt = new DateTime();
    DateTimeZone tz = DateTimeZone.getDefault();
    LocalDateTime nowLocal = new LocalDateTime();
    DateTime nowUTC = nowLocal.toDateTime(DateTimeZone.UTC);

    Date d1 = nowLocal.toDate();
    Date d2 = nowUTC.toDate();

    L.d("tz: " + tz.toString());
    L.d("local: " + d1.toString());
    L.d("utc: " + d2.toString());
  • d1 是我的当地时间,那很好
  • d2 是我的本地时间+ 1,但应该是本地时间-1 …

我的本地时区是UTC + 1(根据调试输出和此处的列表:https : //www.joda.org/joda-
time/timezones.html
)…

如何正确地从一个时区转换为另一个时区(包括毫秒表示)?

编辑

我需要日期/毫秒…这不是正确显示时间…。

编辑2

现在,借助评论和答案,我尝试了以下操作:

    DateTimeZone tz = DateTimeZone.getDefault();
    DateTime nowLocal = new DateTime();
    LocalDateTime nowUTC = nowLocal.withZone(DateTimeZone.UTC).toLocalDateTime();
    DateTime nowUTC2 = nowLocal.withZone(DateTimeZone.UTC);

    Date dLocal = nowLocal.toDate();
    Date dUTC = nowUTC.toDate();
    Date dUTC2 = nowUTC2.toDate();

    L.d(Temp.class, "------------------------");
    L.d(Temp.class, "tz    : " + tz.toString());
    L.d(Temp.class, "local : " + nowLocal +     " | " + dLocal.toString());
    L.d(Temp.class, "utc   : " + nowUTC +       " | " + dUTC.toString()); // <= WORKING SOLUTION
    L.d(Temp.class, "utc2  : " + nowUTC2 +      " | " + dUTC2.toString());

输出值

tz    : Europe/Belgrade
local : 2015-01-02T15:31:38.241+01:00 | Fri Jan 02 15:31:38 MEZ 2015
utc   : 2015-01-02T14:31:38.241 | Fri Jan 02 14:31:38 MEZ 2015
utc2  : 2015-01-02T14:31:38.241Z | Fri Jan 02 15:31:38 MEZ 2015

我想要的是,本地日期显示15点,而utc日期显示14点…现在,这似乎可行…

----- EDIT3-最终解决方案-----

希望这是一个很好的解决方案…我想,我尊重我得到的所有小费…

    DateTimeZone tz = DateTimeZone.getDefault();
    DateTime nowUTC = new DateTime(DateTimeZone.UTC);
    DateTime nowLocal = nowUTC.withZone(tz);

    // This will generate DIFFERENT Dates!!! As I want it!
    Date dLocal = nowLocal.toLocalDateTime().toDate();
    Date dUTC = nowUTC.toLocalDateTime().toDate();

    L.d("tz    : " + tz.toString());
    L.d("local : " + nowLocal +     " | " + dLocal.toString());
    L.d("utc   : " + nowUTC +       " | " + dUTC.toString());

输出:

tz    : Europe/Belgrade
local : 2015-01-03T21:15:35.170+01:00 | Sat Jan 03 21:15:35 MEZ 2015
utc   : 2015-01-03T20:15:35.170Z | Sat Jan 03 20:15:35 MEZ 2015

问题答案:

您正在使它变得比所需复杂得多:

DateTime dt = new DateTime(DateTimeZone.UTC);

完全不需要 转换 。如果您确实需要转换,可以使用withZone。我建议您 避免
通过LocalDateTime,因为那样会因时区转换而丢失信息(两个不同的时刻在同一时区中可能具有相同的本地时间,因为时钟会返回并重复本地时间。

综上所述,出于可测试性的考虑,我个人喜欢使用Clock允许我获取当前时间的接口(例如作为Instant)。然后,您可以在生产环境中运行时使用依赖项注入来注入实际系统时钟,并使用具有预设时间的假时钟来进行测试。Java
8的java.time软件包内置了这个想法,顺便说一句。



 类似资料:
  • 问题内容: 获取当前UTC时间的功能是什么。我已经尝试使用System.getCurrentTime,但是我得到了设备的当前日期和时间。 谢谢 问题答案: 确实会提供自1970年1月1日UTC以来的毫秒数。您看到本地时间的原因可能是因为您在使用实例之前将其转换为字符串。您可以使用s 在任何时区将s 转换为s: 另请参阅此相关问题。

  • 问题内容: 当我创建一个新Date对象时,它将被初始化为当前时间,但是在本地时区。如何获取格林尼治标准时间的当前日期和时间? 问题答案: 尽管它的值通常是与UTC有关的,但它没有特定的时区。是什么让你认为这是当地时间? 准确地说:内的值是自Unix时代(UTC)在1970年1月1日午夜开始的毫秒数。相同的纪元也可以在其他时区进行描述,但是传统的描述是以UTC表示的。由于距固定纪元以来的毫秒数,因此

  • 问题内容: 有人知道MySQL中是否有这样的功能吗? 更新 这不会输出任何有效的信息: 或者也许MySQL本身不知道确切使用了什么,那很好,我们可以在这里介入,只要我能获得不像… 问题答案: 从手册(第9.6节): 可以按以下方式检索全局时区和特定于客户时区的当前值: 编辑如果MySQL设置为系统时区的从属,则以上内容将返回,没有帮助。由于您使用PHP,如果从MySQL的答案是,你可以接着问什么时

  • 问题内容: 在编写Web应用程序时,将 所有 日期时间(服务器端)存储在数据库中作为UTC时间戳是有意义的。 当我发现您无法在JavaScript中对时区进行操作方面自然无法做到这一点时,我感到非常惊讶。 我稍微扩展了Date对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,都会使用该功能格式化时间戳记。 您在这里看到任何重大问题吗?还是从另一个角度解决问题? 在我看来,这有点令人费解

  • 我想在UTC中获取java的当前时间: 所以,我现在在维也纳,当前当地时间是16:30:29,当前与UTC的偏移量是2小时,我想得到 结尾有这个Z(表示“祖鲁时间”)。 用这个 我得到 如何消除微秒? 我也尝试了,但在最后我无法获得Z。

  • 问题内容: 如何使用Java获取当前日期和时间? 我正在寻找与C#等效的东西。 问题答案: 只需构造一个没有任何参数的新对象即可;这会将当前日期和时间分配给新对象。 在的话的Javadoc的无参数的构造函数: 分配一个Date对象并对其进行 初始化,以便它表示分配它的时间( 以最近的毫秒为单位)。 确保您使用的不是-后者没有零参数构造函数,并且语义有所不同,这是完全不同的对话的主题。:)