gpt4 book ai didi

java - 如何将本地 dateTime 对象转换为 UTC java.util.Date

转载 作者:行者123 更新时间:2023-12-01 09:06:31 28 4
gpt4 key购买 nike

我很清楚 java.util.Date 没有时区以及为什么会这样。

我有一个应用程序,用户设置了他的 TimeZone,当他在 DateTime 选择器中选择 Date 时,组件返回一个 Date 对象给我。
然后我需要修改日期以将 UTC 等效值保存在数据库中。

使用 org.joda.time 获取表示本地时区的 UTC 日期的 Date 对象非常简单:

public static final Date getTimeZoneDependantDate(Date pDateUtc, String pUserTimezoneValue) {
// Build the DateTime Object
DateTime originalDate = new DateTime(pDateUtc.getTime(), DateTimeZone.forID(PREF_TIMEZONE_DEF_VALUE));
// Convert the Date
DateTime convertedDate = originalDate.withZone(DateTimeZone.forID(pUserTimezoneValue));
// Return the localTime associated with the timeZone
return convertedDate.toLocalDateTime().toDate();
}

但我坚持如何做相反的事情,将用户选择的日期(从他的时区角度)更改为 UTC。
由于 LocalDateTime 将即时而不是本地 Date 作为参数。

有没有比解析 String 更干净的方法?

最佳答案

tl;博士

您没有提供足够的信息。报告:

  • 结果:myJavaUtilDate.toInstant().toString()
  • 组件的输入
  • 应用当前默认时区

  • 细节

    您并没有真正提供有关您的问题的足够信息。您是否通过 java.util.Date 获得正确的 UTC 日期时间值?是否来自您的 GUI 组件的对象?

    如果用户在魁北克时区 America/Montreal 在 2016 年 12 月 1 日上午 9 点输入,并且您的组件正确地将这些值调整为 UTC在生产 java.util.Date对象,那么你没有问题。对于 UTC,UTC 值将是下午 2 点,如 America/Montreal在该特定日期比 UTC 晚 5 小时。只需通过 Date转换为 java.sql.Timestamp 后将对象添加到数据库中目的。

    仅供引用,旧的日期时间类( DateCalendar 等)和 Joda-Time 现在都被 java.time 类所取代。这是 java.time 中的一些示例代码,显示了您的组件希望采用的行为类型。
    LocalDate ld = LocalDate.of ( 2016 , Month.DECEMBER , 1 );
    LocalTime lt = LocalTime.of ( 9 , 0 );
    ZoneId z = ZoneId.of ( "America/Montreal" );
    ZonedDateTime zdt = ZonedDateTime.of ( ld , lt , z );
    Instant instant = zdt.toInstant (); // UTC

    System.out.println ( "zdt.toString(): " + zdt );
    System.out.println ( "instant.toString(): " + instant );

    zdt.toString(): 2016-12-01T09:00-05:00[America/Montreal]

    instant.toString(): 2016-12-01T14:00:00Z


    Z字符串末尾是 Zulu 的缩写并表示 UTC。

    鉴于 java.util.Date::toString 的不幸行为要在生成字符串时应用您当前的默认时区,我建议您转换您的 DateInstant所以你可以清楚地了解它的值(value)。
    Instant instantConvertedFromDateOfComponent = myJavaUtilDate.toInstant();

    如果在这一步之后您确实看到下午 2 点,那么一切都很好,并且您的组件运行良好。

    如果您的组件表现不佳,忽略时区问题并报告用户的输入,就好像用户打算将 UTC 作为他们自己的时区,那么您将看到 2016-12-01T09:00:00Z .这是一个问题。解决方法是自己进行时区调整。提取“本地”(无区域)值,然后应用预期的时区。

    要获取“本地”日期和时间,首先转换为 OffsetDateTime目的。
    OffsetDateTime odt = instantConvertedFromDateOfComponent.atOffset( ZoneOffset.UTC );
    LocalDateTime ldt = odt.toLocalDateTime(); // 2016-12-01T09:00:00Z
    ZonedDateTime zdt = ldt.atZone( z ); // 2016-12-01T09:00-05:00[America/Montreal]

    如果您的 JDBC 驱动程序符合 JDBC 4.2 或更高版本,您也许可以直接传递这些 java.time 类型。如果没有,则通过添加到旧类的新方法转换为 java.sql 类型。在 Stack Overflow 上已经讨论过很多次,所以请搜索更多信息。

    服务器当前的默认时区应该与您的编程无关。始终在可选参数中明确指定所需/预期的时区,而不是隐式依赖默认值。

    关于 java.time

    java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

    Joda-Time项目,现在在 maintenance mode , 建议迁移到 java.time类。

    要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310 .

    从哪里获得 java.time 类?
  • Java SE 8SE 9然后
  • 内置。
  • 具有捆绑实现的标准 Java API 的一部分。
  • Java 9 添加了一些小功能和修复。
  • Java SE 6SE 7
  • 许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。 .
  • Android
  • ThreeTenABP项目适应 ThreeTen-Backport (上面提到)专门针对Android。
  • How to use… .

  • ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 future 可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

    关于java - 如何将本地 dateTime 对象转换为 UTC java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226136/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com