如何在Java中将"E MMM dd HH:mm:ss z yyyy"
(字符串类型)转换为Date对象?我尝试解析,但是它给出了字符串输出。
DateFormat dfNy1 = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
dfNy1.setTimeZone(TimeZone.getTimeZone("EST"));
final DateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(df.format(dfNy1.parse("Thu Dec 13 00:00:00 EST 2018")));
输出:Thu Dec 13 05:00:00 UTC 2018
我以String格式获取输出,但是我需要与Date对象相同。
答案 0 :(得分:1)
SimpleDateFormatter类的Format方法具有StringBuffer的返回类型,因此,如果要格式化日期,它将始终返回字符串。
您可以阅读相同的Java文档。 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
当您将日期从一个模式格式化为该字符串中的另一个日期对象时,该日期仍将保持不变。那为什么要将对象转换为日期呢?
答案 1 :(得分:0)
请不要再次格式化日期,它将以字符串格式返回。
DateFormat dfNy1 = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
dfNy1.setTimeZone(TimeZone.getTimeZone("EST"));
try {
Date d = dfNy1.parse("Thu Dec 13 00:00:00 EST 2018");
System.out.println(s);`enter code here`
} catch (ParseException e1) {
e1.printStackTrace();
}
答案 2 :(得分:0)
您已经发现,您已经可以成功地将String
的值解析为Date
对象:
DateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
Date date = df.parse("Thu Dec 13 00:00:00 EST 2018");
但是由于Date
对象是一个“即时”对象,因此它不保存任何时区信息。它不过是一个毫秒级的容器,这意味着在解析时区信息丢失之后。参见Java API doc for Date
:
Date类表示特定的瞬时时间,精度为毫秒
幸运的是,自Java 8以来,有了一个新的time-API(请参阅package java.time
),该API具有许多旧的Date
或Calendar
API所缺少的功能。
要将您的String
值解析为功能完整的日期/时间对象(包括时区),请立即使用java.time.format.DateTimeFormatter
:
DateTimeFormatter format = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
ZonedDateTime time = ZonedDateTime.parse("Thu Dec 13 00:00:00 EST 2018", dtf);
现在,您可以直接使用此java.time.ZonedDateTime
,或将其转换为任何其他时区,并保留“即时”:
ZonedDateTime gmtTime = time.withZoneSameInstant(ZoneId.of("GMT");
如果您只对本地时间感兴趣(跳过时区信息),请将其转换为LocalDateTime
:
LocalDateTime localTime = zdt.toLocalDateTime();
LocalDateTime localGmtTime = gmtTime.toLocalDateTime();
有关如何使用新API的更多信息,请查看此Tutorial about the Java time API。