尝试在 Date 中设置时区(我知道 Date 已弃用)
LOG.error(modifiedDate + "Date in service"); //Mon Sep 21 06:15:00 CDT 2020
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.ENGLISH);
format.setTimeZone(TimeZone.getDefault());
String dateString = format.format(modifiedDate);
LOG.error(dateString + " dateString"); //2020-09-21 06:15:00 -0500
Date date = format.parse(dateString);
LOG.error(date + " date after parsing"); //Mon Sep 21 06:15:00 CDT
Run Code Online (Sandbox Code Playgroud)
解析后时区没有改变,我错过了什么?
一个java.util.Date物体在撒谎。这不是约会。这是一个时刻,没有时区信息。它只是围绕millis-since-epoch 的一个包装。它在物理上没有必要的字段来存储它。
(让我们停止将 juDate 的实例称为“日期”,因为它不是一个。您也可以将 Integer 的所有实例称为“字符串”,将所有文件称为“奶奶”,这差不多是正常的)。让我们用正确的名字称呼它们:“蹩脚的瞬间”。
您所做的是设置格式化程序对象的时区。这是按预期工作的:当您使用附加的格式化程序格式化这个蹩脚的即时对象时,您将获得“即时时间”,转换为人类可消费的形式,带有时区信息,针对该时区进行调整。
然后你要求重新解析它,但这是一个问题:这是一项非常广泛的工作;'将这一堆字符解析成一个“糟糕的瞬间”'。
在这种情况下,您提供的 bag o' chars 已经包含时区信息,以便使用。请记住,Date 对象是糟糕的瞬间——它们不包含时区!!
然后应该引起一些注意 - 作为您记录的最后一幕date,它有效地记录了toString()在您糟糕的即时实例上调用该方法的结果。这将....创建具有系统默认的时区格式化,并用它来呈现在人类的形式,但毫无疑问,这是不是其实什么是存储在糟糕的时刻,你有对象。所有存储在那里的都是1600686900000. 就是这样。
我强烈建议您遵循 deHaar 的评论:不,您不想要蹩脚的 Instant。如果您收到一个类型为蹩脚的即时( java.util.Date) 的值,请将其转换为Instant立即。
如果您必须将计算出的时间值传递回某个方法、界面或字段或诸如此类,并且必须采用日期格式,请将您的漂亮即时实例 ( java.time.Instant)转换回蹩脚的即时格式。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |