SimpleDateFormat 和 DataFormat 具有不同的时区



我对SimpleDateFormatDateFormat有问题。虽然我已经在德国设置了本地时区,但显示的是不同的时区。 输出为:

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

在您的代码中,您在DateFormatSimpleDateFormat上都设置了区域设置(GERMANY(。您没有设置任何时区。尽管区域设置和时区可能都与地理区域相关联(并非总是如此(,但它们并不直接相关,因此设置其中一个永远不会影响另一个。此外,如果您在SimpleDateFormat上设置时区和区域设置,则它们都不会反映在您从其parse方法获得的Date中,因为Date既不能保存时区也不能保存区域设置。这只是一个时间点。

相反,两种格式都使用了 JVM 的时区设置。dateFormat使用GERMANY区域设置,因此为Mitteleuropäische Sommerzeit制作了MESZ,这是中欧夏令时的德语名称。simpleDateFormatTmp使用相同的默认时区将日期时间字符串解释为时间点,但正如我所说,没有将时区存储到Date中。当你打印Date时,你隐式调用了它的toString方法。此方法再次使用 JVM 的默认时区来生成字符串。这一事实使许多人感到困惑。但是,toString总是使用英语,所以日期是"星期二"(星期二(,月份是"五月",中欧夏令时的半时区是"CEST",与一直使用的时区相同。

顺便说一下,中欧夏令时不是一个真正的时区。相反,它是在一年中大约 7 个月中夏令时生效的中欧时间的夏令时感知名称(夏令时也称为夏令时或 DST(。反过来,中欧时间是当今共享相同时间的大量欧洲时区的通用名称,但并不总是如此,因此不能被视为相同。

在我的代码中,我使用ZonedDateTime来保存日期。与Date相反,顾名思义,它确实拥有时区,因此似乎给了你想要的。其toString方法将时区呈现为欧洲/柏林。要获得 MESZ,只需使用与另一个字符串相同的格式化程序。

我强烈建议使用现代Java日期和时间APIjava.time,抛弃早已过时的DateFormatSimpleDateFormatDate。现代 API 使用起来要好得多。

链接:Oracle 教程:日期时间解释如何使用java.time

最新更新