gpt4 book ai didi

java - 在 Java 中将本地时间转换为 UTC

转载 作者:行者123 更新时间:2023-11-29 18:41:12 24 4
gpt4 key购买 nike

我正在尝试在 java 中将本地时间转换为 UTC 时间。我写了代码:

    String datesToConvert = "31-12-2018 23:37:00";
String dateFormat = "dd-MM-yyyy HH:mm:ss";

SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat);
sdf2.setTimeZone(TimeZone.getDefault());
Date gmt = null;

SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

try {
gmt = sdf2.parse(datesToConvert);
System.out.println("UTC FORMATTED DATE : " + sdfOutPutToSend.format(gmt));

} catch (Exception e) {
e.printStackTrace();
}

我得到的输出是:UTC 格式化日期:2018-12-31T18:07:00.000Z

但我希望它是相同的日期和时间,但最后在 .000Z 中发生变化,这显示了时差。

最佳答案

tl;dr

使用现代 java.time 类。

LocalDateTime
.parse(
"31-12-2018 23:37:00" ,
DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" )
)
.atOffset(
ZoneOffset.UTC
)
.toString()

2018-12-31T23:37Z

java.time

使用现代 java.time 类,而不是那些可怕的遗留类,例如 Date

将您的输入字符串解析为 LocalDateTime,因为它缺少任何时区指示符或与 UTC 的偏移量,因此代表一个时刻。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "31-12-2018 23:37:00" , f ) ;

您声称知道用于此输入字符串的时区。如果您确定,应用 ZoneId 来获取 ZonedDateTime,以确定实际时刻,即时间轴上的一个点。

指定 proper time zone name格式为continent/region,如America/Montreal , Africa/Casablanca ,或 太平洋/奥克兰。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

您的问题不清楚。但看起来您可能是在说输入是为了代表 UTC 中的一个时刻。如果是这样,应用 ZoneOffset.UTC 常量来获取 OffsetDateTime 对象。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

Desired Output: 2018-12-31T23:37:00.808Z

这是不可能的,因为您的输入字符串缺少小数秒 .808

您报告的结尾有问题,.000Z 是正确的,因为零表示没有小数秒。末尾的 Z 表示 UTC(UTC 偏移量为零),是 +00:00 的缩写,发音为 Zulu


关于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 对象。使用JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

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

关于java - 在 Java 中将本地时间转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53029858/

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