当前位置: 首页 > 知识库问答 >
问题:

将java日历对象从本地时间转换为UTC时间

东方和志
2023-03-14

如何将JavaCalendar对象从本地时间转换为UTC?这是我尝试过的:

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
    calendar.setTime(localDateTime.getTime());
    SimpleDateFormat outputFmt = new SimpleDateFormat("MMM dd, yyy h:mm a zz");
    String dateAsString = outputFmt.format(calendar.getTime());
    System.out.println(dateAsString)

时间总是以MT而非GMT显示。我想将日历以UTC存储在数据库中(我不关心时间的格式或显示)。

共有3个答案

钮巴英
2023-03-14

下面是我如何将正常日期转换为UTC的。因此,首先将日历对象转换为日期对象:

public static String convertToUTC(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(date);
}
薛宜
2023-03-14

不要将日期时间转换为字符串以存储到SQL数据库中。使用日期时间对象。

我假设您正在将数据存储到数据类型为无时区的datetime或timestamp的数据库列中,并且该列将包含UTC值(推荐做法)。在这种情况下,进一步假设您至少使用Java 8和JDBC 4.2,将UTC中的LocalDateTime存储到数据库中。

    ZonedDateTime dateTime = ZonedDateTime.of(
            2018, 7, 1, 9, 0, 0, 0, ZoneId.of("America/Denver"));
    LocalDateTime dateTimeInUtc = dateTime.withZoneSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();
    System.out.println("UTC: " + dateTimeInUtc);

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table(date_time) values (?)");
    ps.setObject(1, dateTimeInUtc);
    ps.executeUpdate();

代码示例于7月1日上午9点在丹佛进行转换并打印:

UTC:2018-07-01T15:00

然后将打印的UTC时间存储到数据库中。请注意setObject方法的使用。

您使用的日历类早已过时,而且总是设计得很糟糕。如果您从旧式API中获得了一个无法更改或现在不想更改的日历对象,请先将其转换为即时对象,然后再进行进一步转换:

    Calendar localDateTime = // …;
    LocalDateTime dateTimeInUtc = localDateTime.toInstant()
            .atOffset(ZoneOffset.UTC)
            .toLocalDateTime();

编辑:这取决于数据库中使用的数据类型和JDBC驱动程序的要求。正如我所说,我假设您知道数据库中的值以UTC为单位,并且您使用的数据类型没有时区,因此数据库不知道。如果是这种情况,那么将Java类型与时区或偏移量信息一起使用是没有意义的,因为在存储它时,它将丢失。

有人会说,在这种情况下,您已经在数据库中使用了错误的类型,并会建议您使用带有timezone列的时间戳,以便数据库也知道时间以UTC表示。在这种情况下,您当然应该在存储的值中包含偏移量信息。例如,PostgreSQL JDBC驱动程序在这种情况下需要OffsetDateTime,这是合乎逻辑的(因为它存储的是UTC偏移量,而不是实时时区)。

根据DBMS的功能,可能还有其他选项。我已经在底部添加了几个链接,您可以查看更多。

您对日历的转换工作正常,并在UTC中为您提供了相同的时间点。当您尝试将其格式化为字符串时,问题才开始:当您使用日历时。getTime(),您将获得一个包含相同时间点(仍然是正确的时间点)的日期对象,但日期不能保存时区信息,因此您丢失了有关UTC的信息。接下来,使用SimpleDataFormat格式化日期。SimpleDataFormat有一个时区,如果您不自己设置,它将使用JVM的时区设置,这可能是山地时间的一种变体。所以你的时间是用MT打印的。

  • Java™ 教程:解释如何使用java的日期时间。时间,现代Java日期和时间API
何建中
2023-03-14

您需要在SimpleDataFormat上调用setTimeZone,而不是在Calendar上调用:

//getting local time 
Calendar calendar = Calendar.getInstance(Locale.getDefault());

SimpleDateFormat outputFmt = new SimpleDateFormat("MMM dd, yyy h:mm a zz");
outputFmt.setTimeZone(TimeZone.getTimeZone("GMT")); //set timezone here

//shows calendar time correctly set    
System.out.println(outputFmt.format(calendar.getTime()));
 类似资料:
  • 问题内容: 从服务器上,我得到了这种格式的datetime变量:它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时间。 如何使用JavaScript或jQuery完成此操作? 问题答案: 在将字符串转换为javascript中的日期之前,将’UTC’附加到字符串中:

  • 问题内容: 我知道已经有很多关于将UTC时间/日期转换为本地时间/从本地时间转换为答案的帖子,但是没有帮助我弄清楚我的问题是什么。我的问题是:通过具有UTC时间戳,我如何获取本地DateTime?这就是我现在所拥有的,但这只是将时间戳转换为DateTime格式。 编辑:我将UTC时间戳保存在云中,以便每个设备(Android / iOS)都可以查询并将其转换为时区。 问题答案: 试试这个与我一起工

  • 我想把这个2021年1月20日20:10:14转换成yyyy-MM-dd'T'HH:MM:ss格式。Android系统中的SSS'Z'。目前我正在使用函数,但当我转换为本地格式时,我没有得到原始时间

  • 问题内容: 我知道这个主题已被殴打致死,但在搜寻了这个问题几个小时之后,我不得不问。 我的问题:根据客户端应用程序(iphone)的当前时区对服务器上的日期进行计算。客户端应用程序以秒为单位告诉服务器,其时区距GMT的距离。然后,我想使用此信息对服务器中的日期进行计算。服务器上的日期都存储为UTC时间。 因此,在将UTC日期对象转换为该本地时区之后,我想获取其HOUR。 我目前的尝试: 变量小时和

  • 问题内容: 我使用以下方式将UTC日期存储到数据库中: 然后我要将保存的UTC日期转换为客户的本地时间。 我怎样才能做到这一点? 谢谢 问题答案: 并且都使用服务器除非被覆盖本地时区; 您可以覆盖与一起使用的时区。

  • 问题内容: 我有一个毫秒本地本地时间戳,我想将其转换为毫秒本地UTC时间戳。快速浏览一下文档,看起来像这样工作: 有一个更好的方法吗? 问题答案: 使用a 来获取本地纪元处的偏移量,然后将其添加到本地纪元时间戳中。