我对SimpleDateFormat和DateFormat有意见。虽然我在德国的两个地方都设置了当地时区,但显示的时区不同。输出为:
SimpleDateFormat:Tue May 01 00:00:00 CEST 2018
DateFromat: 26.05.18 08:46:24 MESZ我的代码:
public class StringAndDateFormat {
private static final int dateStyleLoc = DateFormat.SHORT;
private static final int timeStyleLoc= DateFormat.LONG;
private static final Locale localeLoc = Locale.GERMANY;
private static final String stringDateIni= "2000/01/01 00:00:00:";
public static void main(String[] args) {
System.out.println(getStringNow());
System.out.println(getDateFromStringSimpleDateFormat("01.05.2018 00:00:00"));
}
public static String getStringNow() {
DateFormat dateFormat = DateFormat.getDateTimeInstance(dateStyleLoc, timeStyleLoc, localeLoc);
return dateFormat.format(new Date());
}
public static Date getDateFromStringSimpleDateFormat(String stringDateIn) {
SimpleDateFormat simpleDateFormatTmp = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss",localeLoc);
Date dateTmp= null;
try {
dateTmp= simpleDateFormatTmp.parse(stringDateIn);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return dateTmp;
}发布于 2018-05-26 16:35:17
private static final Locale localeLoc = Locale.GERMANY;
private static final ZoneId zoneLoc = ZoneId.of("Europe/Berlin");
private static final DateTimeFormatter formatterLoc = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.LONG)
.withLocale(localeLoc);
public static void main(String[] args) {
System.out.println(getStringNow());
ZonedDateTime parsedDateTime
= getDateFromStringDateTimeFormatter("01.05.2018 00:00:00");
System.out.println(parsedDateTime);
System.out.println(parsedDateTime.format(formatterLoc));
}
public static String getStringNow() {
return ZonedDateTime.now(zoneLoc).format(formatterLoc);
}
public static ZonedDateTime getDateFromStringDateTimeFormatter(String stringDateIn) {
DateTimeFormatter formatterTmp
= DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss", localeLoc);
return LocalDateTime.parse(stringDateIn, formatterTmp).atZone(zoneLoc);
}运行刚才打印的这段代码
26.05.18, 10:12:41 MESZ
2018-05-01T00:00+02:00[Europe/Berlin]
01.05.18, 00:00:00 MESZ在您的代码中,您已经在DateFormat和SimpleDateFormat上设置了区域设置(GERMANY)。您尚未设置任何时区。尽管地区和时区可能都与一个地理区域相关联(并不总是如此),但它们并不是直接相关的,因此设置其中一个不会影响另一个。此外,如果在SimpleDateFormat上设置时区和区域设置,它们都不会反映在从其parse方法获得的Date中,因为Date既不能保存时区,也不能保存区域设置。这只是一个时间点。
实际上,这两种格式都使用JVM的时区设置。dateFormat使用GERMANY语言环境,因此为中欧夏季时间的德语名称Mitteleuropäische Sommerzeit生成了MESZ。simpleDateFormatTmp使用相同的默认时区将日期-时间字符串解释为某个时间点,但正如我所说的,它没有将时区存储到Date中。在打印Date时,您隐式调用了它的toString方法。此方法再次使用JVM的默认时区来生成字符串。这一事实让许多人感到困惑。但是,toString始终使用英语,因此日期是“Tue”(星期二),月份是“May”,中欧夏季时间的半时区是“CEST”,这与一直使用的时区相同。
顺便说一下,中欧夏季时间不是真正的时区。相反,它是夏季时间的名称,用于一年中约7个月的中欧时间,其中夏季时间有效(夏季时间也称为夏令时或DST)。而中欧时间是许多欧洲时区的通用名称,这些时区目前共享相同的时间,但并不总是如此,因此不能被认为是相同的。
在我的代码中,我使用ZonedDateTime来保存日期。与Date相反,顾名思义,它确实拥有一个时区,因此似乎能给你想要的东西。它的toString方法将时区呈现为欧洲/柏林。要获取MESZ,只需使用与其他字符串相同的格式化程序即可。
我强烈推荐使用java.time,这是现代Java date and time API,去掉了早已过时的DateFormat、SimpleDateFormat和Date。现代的API使用起来要好得多。
链接: Oracle tutorial: Date Time解释如何使用java.time。
https://stackoverflow.com/questions/50540127
复制相似问题