我正在尝试转换字符串,例如
String dateString = "Mon Mar 30 13:51:35 UTC 2015";
日期对象中的。
我试过了:
DateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("Date Object:"+sdf.parse(dateString));
但是日期对象的输出是
Mon Mar 30 15:51:35 CEST 2015
你可以看到: 1)它将字符串的时间提前两小时 2)它改变UTC - > CEST
我尝试了很多解决方案,但没有任何效果。这样做的正确方法是什么?
编辑:我的目标是从原始字符串中获取一个Date对象。该Date对象应具有与日期字符串相同的参数。在这种情况下,一天中的原始时间(13)变为15,但是期望它保持在13.我需要这个,因为在我的程序中我将需要比较两个不同的日期对象。
编辑:JAVA 8解决方案 搜索更新的Java 8,我发现了一个更好,更优雅的解决方案。这是代码 String pattern = "EEE MMM dd HH:mm:ss SSS zzz yyyy";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, Locale.UK).withZone(ZoneId.of("UTC"));
final ZonedDateTime parsed = ZonedDateTime.parse(dateString, formatter);
此外,将其与例如当前时间进行比较:
ZonedDateTime now = ZonedDateTime.now();
int compared = parsed.compareTo(now);
System.out.println("NOW:"+now.toLocalDateTime()+" PARSED:"+parsed.toLocalDateTime()+" COMPARED:"+compared);
答案 0 :(得分:1)
你正确地做到了。正确解析日期。您只是将日期打印到本地计算机时区。当您将toString()转换为日期时,请在本地计算机时区中打印日期。
Mon Mar 30 15:51:35 CEST 2015 == 2015年3月30日星期一13:51:35
CEST是UTC +2
答案 1 :(得分:0)
实际上,java.util.Date
没有时区。里面有一个时区,但不能设置也没有。在这些旧的日期时间类中做出的许多糟糕的设计决策之一。
Date::toString
方法在生成输出字符串时应用JVM的当前默认时区。做得很好,但没有帮助,因为它会造成你的Date对象在该区域中的错觉,而事实上并非如此。
您正在使用一个麻烦的旧遗留类,现在已被Java 8及更高版本中内置的java.time框架所取代。
从Date
转换为Instant
,在时间轴上以UTC为单位,分辨率为纳秒。
Instant instant = myJavaUtilDate.toInstant();
致电toString
。解析/生成字符串时,java.time类使用标准的ISO 8601格式。
String output = instant.toString();
要创建字符串,请使用常量Instant
从OffsetDateTime
转换为ZoneOffset.UTC
。然后使用java.time.format类生成字符串。
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , ZoneOffset.UTC );
搜索Stack Overflow以获取更多信息和示例。这些问题已经解决了数百次。
答案 2 :(得分:-1)
答案 3 :(得分:-1)
您已拥有Date
个对象。如果您想以您想要的格式打印它,您也可以使用DateFormat
format
Date
对象:
Date date = sdf.parse(dateString);
System.out.println("Date Object:"+sdf.format(date));
// Use the date object ...