首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleDateFormat和DataFormat具有不同的时区

SimpleDateFormat和DataFormat具有不同的时区
EN

Stack Overflow用户
提问于 2018-05-26 14:48:32
回答 1查看 323关注 0票数 0

我对SimpleDateFormatDateFormat有意见。虽然我在德国的两个地方都设置了当地时区,但显示的时区不同。输出为:

代码语言:javascript
复制
SimpleDateFormat:Tue May 01 00:00:00 CEST 2018
DateFromat: 26.05.18 08:46:24 MESZ

我的代码:

代码语言:javascript
复制
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;
    }
EN

回答 1

Stack Overflow用户

发布于 2018-05-26 16:35:17

代码语言:javascript
复制
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);
}

运行刚才打印的这段代码

代码语言:javascript
复制
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生成了MESZsimpleDateFormatTmp使用相同的默认时区将日期-时间字符串解释为某个时间点,但正如我所说的,它没有将时区存储到Date中。在打印Date时,您隐式调用了它的toString方法。此方法再次使用JVM的默认时区来生成字符串。这一事实让许多人感到困惑。但是,toString始终使用英语,因此日期是“Tue”(星期二),月份是“May”,中欧夏季时间的半时区是“CEST”,这与一直使用的时区相同。

顺便说一下,中欧夏季时间不是真正的时区。相反,它是夏季时间的名称,用于一年中约7个月的中欧时间,其中夏季时间有效(夏季时间也称为夏令时或DST)。而中欧时间是许多欧洲时区的通用名称,这些时区目前共享相同的时间,但并不总是如此,因此不能被认为是相同的。

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

我强烈推荐使用java.time,这是现代Java date and time API,去掉了早已过时的DateFormatSimpleDateFormatDate。现代的API使用起来要好得多。

链接: Oracle tutorial: Date Time解释如何使用java.time

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50540127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档