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
提前谢谢。 肖恩
# 1 楼答案
爪哇。时间和三分钟
防弹的方法是改用java。时间,现代Java日期和时间API
输出为:
你的代码出了什么问题
这当然是一个时区问题。然而,它并不是通过天真地运行代码来复制的。还有更多的事情,我们只能猜测到底发生了什么。我将介绍几种可能发生这种情况的方式
第一种可能性是,JVM的默认时区可能已经更改。为了证明:
平心而论,这不是一整天的错误,而是6个小时。这已经够糟糕的了,当然,一周中的某一天和一个月中的某一天是错误的。请注意,JVM的时区设置可能已从程序的完全不同部分或同一JVM中运行的不同程序更改。发生的事情是:
SimpleDateFormat
得到了JVM的默认时区,即UTC。于是将日期解析为UTC 6月5日的第一个时刻。此时此刻,北美仍然是6月4日。接下来,当我们打印Date
时,Date.toString()
获取JVM的(更改的)时区,并使用它来呈现字符串。因此,我们得到的是MDT时间(北美山地夏时制),而不是用于解析的UTC时间不过,我们不需要像为整个JVM设置时区这样激烈的事情来演示。设置格式化程序的时区就足够了
在美国/埃德蒙顿时区跑步时:
发生的情况基本上与上述相同
问:java不是吗。时间要求Android API级别26
爪哇。时间在旧的和新的安卓设备上都能很好地工作。它只需要至少Java6
org.threeten.bp
导入日期和时间类李>链接
java.time
首次被描述李># 2 楼答案
这是
TimeZone
的常见问题,您需要为sdf
设置正确的时区,例如:如果你设置了正确的时区,你会看到正确的一天:)
希望有帮助