有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SimpleDataFormat。解析(日期\字符串)生成上一个日期

我有个奇怪的问题

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);

我称之为:

Date date = sdf.parse("06/05/2020");

它显示的“日期”是2020年6月4日,也就是说,少了一天

SimpleDataFormat哪里错了

我正在使用Android Studio 3.5.1和Androidx

提前谢谢。 肖恩


共 (2) 个答案

  1. # 1 楼答案

    爪哇。时间和三分钟

    防弹的方法是改用java。时间,现代Java日期和时间API

        DateTimeFormatter dateFormatter
                = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.ENGLISH);
    
        LocalDate date = LocalDate.parse("06/05/2020", dateFormatter);
    
        System.out.println(date);
    

    输出为:

    2020-06-05

    你的代码出了什么问题

    这当然是一个时区问题。然而,它并不是通过天真地运行代码来复制的。还有更多的事情,我们只能猜测到底发生了什么。我将介绍几种可能发生这种情况的方式

    第一种可能性是,JVM的默认时区可能已经更改。为了证明:

        TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
        Date date = sdf.parse("06/05/2020");
    
        TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));
        System.out.println(date);
    

    Thu Jun 04 18:00:00 MDT 2020

    平心而论,这不是一整天的错误,而是6个小时。这已经够糟糕的了,当然,一周中的某一天和一个月中的某一天是错误的。请注意,JVM的时区设置可能已从程序的完全不同部分或同一JVM中运行的不同程序更改。发生的事情是:SimpleDateFormat得到了JVM的默认时区,即UTC。于是将日期解析为UTC 6月5日的第一个时刻。此时此刻,北美仍然是6月4日。接下来,当我们打印Date时,Date.toString()获取JVM的(更改的)时区,并使用它来呈现字符串。因此,我们得到的是MDT时间(北美山地夏时制),而不是用于解析的UTC时间

    不过,我们不需要像为整个JVM设置时区这样激烈的事情来演示。设置格式化程序的时区就足够了

        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        Date date = sdf.parse("06/05/2020");
        System.out.println(date);
    

    在美国/埃德蒙顿时区跑步时:

    Thu Jun 04 18:00:00 MDT 2020

    发生的情况基本上与上述相同

    问:java不是吗。时间要求Android API级别26

    爪哇。时间在旧的和新的安卓设备上都能很好地工作。它只需要至少Java6

    • 在Java8和更高版本以及更新的Android设备(API级别26)上,现代API是内置的
    • 在非Android Java 6和7中,获得了三个后端口,即现代类的后端口(三个十用于JSR 310;请参阅底部的链接)
    • 在(旧版)Android上,使用Android版的Three Ten Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类

    链接

  2. # 2 楼答案

    这是TimeZone的常见问题,您需要为sdf设置正确的时区,例如:

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

    如果你设置了正确的时区,你会看到正确的一天:)

    希望有帮助