【问题标题】:Set timeZone in Date Java在 Date Java 中设置时区
【发布时间】:2021-01-08 14:40:00
【问题描述】:

尝试在 Date 中设置 timeZone(我知道 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 

解析后时区没有改变,我错过了什么?

【问题讨论】:

标签: java date


【解决方案1】:

java.util.Date 对象在撒谎。这不是约会。这是一个时刻,它没有时区信息。它只是对millis-since-epoch 的封装。它实际上没有必要的字段来存储它。

(让我们停止将 juDate 的实例称为“日期”,因为它不是一个。您不妨将 Integer 的所有实例称为“字符串”,将所有文件称为“奶奶”,差不多一样理智)。让我们用他们的正确名字来称呼他们:“蹩脚的瞬间”。

您所做的是设置格式化程序对象的时区。这是按预期工作的:当您使用带有时区信息的格式化程序格式化此糟糕的即时对象时,您会得到“即时”,翻译成人类可消费的形式,带有时区信息,已针对该时区进行了调整。

然后您要求重新解析它,但这是一个问题:这是一项非常广泛的工作; '将这串字符解析成一个“糟糕的瞬间”'。

在这种情况下,您提供的 bag o' chars 已经包含时区信息,以便使用。请记住,日期对象是糟糕的瞬间 - 它们不包含时区!!

这应该引起一些人的注意 - 作为最后一幕,您记录了 date,它有效地记录了在您的 糟糕的即时实例上调用 toString() 方法的结果。这将....创建一个具有系统默认时区的格式化程序,并使用它以人类形式呈现它,但不要搞错,这 不是 实际上存储在那个 糟糕的瞬间 对象。那里存储的所有内容都是1600686900000。就是这样。

我强烈建议您关注 deHaar 的评论:不,您不想要糟糕的即时。如果您有一个 crappy instant (java.util.Date) 类型的值传递给您,请立即将其转换为 Instant

如果您必须将计算出的时间值交还给某个方法或接口或字段或诸如此类的东西,并且必须采用日期形式,请将您的 nice instant 实例 (java.time.Instant) 转换回一个 糟糕的即时形式。

【讨论】:

  • +1,在我对未来问题的所有解释中,我肯定会开始为 java.util.Date 使用正确的“糟糕的即时”名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2016-07-06
  • 2021-09-06
  • 2017-10-15
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多