gpt4 book ai didi

java - 将日期字符串 (EST) 转换为 Java 日期 (UTC)

转载 作者:行者123 更新时间:2023-11-30 07:22:12 26 4
gpt4 key购买 nike

我需要一些关于这个 java 方法的建议。此方法的目的是获取表示日期的字符串 - 此字符串是根据 EST 时区中的日期创建的 - 并将其转换为 UTC 时区中的 java Date 对象。

private Date buildValidationDate(String dateString) throws ParseException {
System.out.println("dateString " + dateString);

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyy hh:mm a");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
dateFormat.setLenient(true);
Date dt = dateFormat.parse(dateString);

System.out.println("dt " + dt);

return dt;
}

我看到的问题是 dt 的值似乎不对。例如,如果 dateString 是“2012 年 10 月 16 日下午 12:06”——我期望 dt 的值(UTC 格式)类似于“2012 年 10 月 16 日星期二下午 4:06”。相反,dt 的值是“2012 年 10 月 16 日星期二 07:06:00 CDT”。这似乎不是正确的 UTC 时间。

我很感激任何建议,如果这似乎是一个简单的问题,我很抱歉我在 Java 日期方面遇到了很多麻烦。我不确定我的编码是否有误,或者我的方法是否有问题。谢谢

最佳答案

作为correct accepted answer by Singh说,你的 Date 实际上是 在 UTC 中,但它的 toString 方法在生成字符串时混淆地应用了当前默认时区。

ISO 8601

对于日期时间值,请避免使用诸如 10/16/2012 12:06 PM 这样的格式。序列化为文本时,使用 ISO 8601为此目的定义为标准的格式。

java.time

I'm sorry if this seems to be an easy question I have a lot of trouble with Java dates

不是你;这是类(class)。旧的遗留日期时间类是处理日期时间的勇敢的行业领先努力。但事实证明,它们构思不当、设计不当、非常困惑和麻烦。现在被 java.time 类所取代——一个巨大的改进。

完全避免这个麻烦的旧 java.util.Date 类。而是使用 Instant 代替它。

即时

Instant class 代表时间轴上的一个时刻 UTC分辨率为 nanoseconds (最多九 (9) 位小数)。

获取当前时刻。

Instant instant = Instant.now();

您可以通过调用添加到旧日期时间类的新转换方法之一将 Date 转换为其现代替代方法。只需调用 toInstant,非常简单。

Instant instant = myJavaUtilDate.toInstant(); 

java.time 类在生成字符串时默认使用 ISO 8601 格式。只需调用 toString 即可清楚地表示对象中的值。

String output = instant.toString();

2016-12-23T01:33:09.731Z

解析

要解析您的输入字符串,请定义要匹配的格式化模式。模式代码与 SimpleDateFormat 类似,但不完全相同。所以一定要仔细研究文档。

String input = "10/16/2012 12:06 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a" );

您的输入没有任何关于与 UTC 或时区的偏移量的线索。所以我们必须解析为 LocalDateTime .缺少任何偏移量或区域,LocalDateTime 只是关于可能时刻的模糊想法,但代表时间轴上的一个点。

LocalDateTime ldt = LocalDateTime.parse( input , f );

ldt.toString(): 2012-10-16T12:06

问题声称这是针对“EST 时区”的。因此,我们需要将时区、ZoneId 应用到我们的 LocalDateTime 以获得 ZonedDateTime

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

EST 可能是指美国和加拿大东海岸大部分地区使用的时区。我将任意选择 America/New_York

ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString(): 2012-10-16T12:06-04:00[America/New_York]

要获取 UTC,只需提取一个 Instant。您可以在概念上将其视为:

ZonedDateTime = ( Instant + ZoneId )

Instant instant = zdt.toInstant();

instant.toString(): 2012-10-16T16:06:00Z

关于java - 将日期字符串 (EST) 转换为 Java 日期 (UTC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919067/

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