转换日期字符串Mon Mar 30 13:51:35 UTC 2015 to Date Object

时间:2016-05-02 15:34:24

标签: java date datetime simpledateformat

我正在尝试转换字符串,例如

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);

4 个答案:

答案 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.time

您正在使用一个麻烦的旧遗留类,现在已被Java 8及更高版本中内置的java.time框架所取代。

Date转换为Instant,在时间轴上以UTC为单位,分辨率为纳秒。

Instant instant = myJavaUtilDate.toInstant();

致电toString。解析/生成字符串时,java.time类使用标准的ISO 8601格式。

String output = instant.toString();

要创建字符串,请使用常量InstantOffsetDateTime转换为ZoneOffset.UTC。然后使用java.time.format类生成字符串。

OffsetDateTime odt = OffsetDateTime.ofInstant( instant , ZoneOffset.UTC );

搜索Stack Overflow以获取更多信息和示例。这些问题已经解决了数百次。

答案 2 :(得分:-1)

而不是UTC,在获取时区时使用GMT

sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

Source

答案 3 :(得分:-1)

您已拥有Date个对象。如果您想以您想要的格式打印它,您也可以使用DateFormat format Date对象:

Date date = sdf.parse(dateString);
System.out.println("Date Object:"+sdf.format(date));
// Use the date object ...