use*_*804 2 java date data-conversion simpledateformat
我需要一些关于这个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;
}
Run Code Online (Sandbox Code Playgroud)
我看到的问题是 dt 的值似乎已关闭。例如,如果 dateString 是 '10/16/2012 12:06 PM' - 我期望 dt 的值(以 UTC 表示)类似于 'Tuesday, October 16, 2012 4:06 PM'。相反,dt 的值是“Tue Oct 16 07:06:00 CDT 2012”。这似乎不是正确的 UTC 时间。
我很感激任何建议,如果这似乎是一个简单的问题,我很抱歉我在 Java 日期方面遇到了很多麻烦。我不确定我的编码是否错误,或者我的方法是否有问题。谢谢
正如辛格所接受的正确答案所说,您Date实际上是在 UTC 中,但其toString方法在生成字符串时混淆地应用了当前的默认时区。
10/16/2012 12:06 PM避免使用诸如日期时间值之类的格式。序列化为文本时,请使用为此目的定义的标准ISO 8601格式。
\n\n\n如果这似乎是一个简单的问题,我很抱歉我在 Java 日期方面遇到了很多麻烦
\n
这不是你;这是课程。旧的遗留日期时间类在处理日期时间方面是业界领先的勇敢努力。但事实证明,它们构思不周、设计不当、非常混乱且麻烦。现在被 java.time 类 \xe2\x80\x93 取代,这是一个巨大的改进。
\n\n完全避免这个麻烦的旧java.util.Date类。Instant而是在其位置使用。
Instant该类表示UTCInstant时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。
获取当前时刻。
\n\nInstant instant = Instant.now();\nRun Code Online (Sandbox Code Playgroud)\n\n您可以通过调用添加到旧日期时间类的新转换方法之一将日期转换为其现代替代品。只需调用Instant即可,非常简单。
\n\nInstant instant = myJavaUtilDate.toInstant(); \nRun Code Online (Sandbox Code Playgroud)\n\njava.time 类在生成字符串时默认使用 ISO 8601 格式。只需调用即可toString获得对象内值的清晰表示。
String output = instant.toString();\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n2016-12-23T01:33:09.731Z
\n
要解析您的输入字符串,请定义要匹配的格式模式。模式代码与 类似,SimpleDateFormat但不完全相同。所以一定要仔细研究文档。
String input = "10/16/2012 12:06 PM" ;\nDateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a" );\nRun Code Online (Sandbox Code Playgroud)\n\n您的输入缺乏任何关于与 UTC 或时区的偏移量的线索。所以我们必须解析为LocalDateTime. 由于缺乏任何偏移量或区域, aLocalDateTime只是关于可能时刻的模糊想法,但并不时间轴上的点。
LocalDateTime ldt = LocalDateTime.parse( input , f );\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nldt.toString(): 2012-10-16T12:06
\n
该问题声称这是针对 \xe2\x80\x9cEST 时区\xe2\x80\x9d 的。所以我们需要应用一个时区 aZoneId来LocalDateTime获得ZonedDateTime。
以、、 或 等格式指定正确的时区名称。切勿使用 3-4 个字母的缩写,例如或 ,因为它们不是continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST真正的时区,不是标准化的,甚至不是唯一的(!)。
也许EST您指的是美国和加拿大东海岸大部分地区使用的时区。我会随意选择America/New_York。
ZoneId z = ZoneId.of( "America/New_York" );\nZonedDateTime zdt = ldt.atZone( z );\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nzdt.toString(): 2012-10-16T12:06-04:00[美国/纽约]
\n
要获取 UTC,只需提取Instant. 您可以从概念上将其视为:
\n\n\nZonedDateTime = (即时 + ZoneId )
\n
Instant instant = zdt.toInstant();\nRun Code Online (Sandbox Code Playgroud)\n\n\n\ninstant.toString(): 2012-10-16T16:06:00Z
\n