从了解如何Date
工作开始。当你这样做...
logger.info("Before converting : "+date);
该类Date
使用它的toString
方法将类表示的日期/时间信息Date
格式化为人类可读的格式。它无论如何都不会“转换”日期/时间值
因此,从上面获取您的代码(并对其进行修改以使其正常工作),它会输出...
Before converting : Sat Jun 23 04:58:15 AEST 2018
20180623 04:58:15
在我的机器上 - 为什么值相同?因为输入没有任何时区信息,所以时间很可能被视为机器本地时区中的时间(并且该值被简单地格式化为输出)。
Date
只是自 Unix 纪元以来毫秒数的容器,它与格式无关 - 这意味着它不携带格式信息。
Date
也被有效地弃用 - 更不用说也setDate
被弃用了
总体而言,更好的(起点)是使用 Java 8 中引入的较新的日期/时间 API(并且该API支持早期版本的 API)
String timeStamp = "20180623 05:58:15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(timeStamp, formatter);
ldt = ldt.minusMinutes(2);
System.out.println(ldt);
System.out.println(ldt.format(formatter));
这将输出...
2018-06-23T05:56:15
20180623 05:56:15
输入和输出仍然被认为是在机器本地时区。
但我不想在这里检查时区,我给它的时间应该减去 2 分钟
请记住,API 仍然需要有一些时区概念,天气是本地时区或 UTC/GMT,但由于您的输入不提供任何类型的信息,您需要选择“如何”最好来处理那个问题。上面的示例只是“假定”本地时间,但您可以使用ZonedDateTime
并将其转换为执行操作的“通用”时区,或者更好的是,让所有字符串都带有时区信息
哦,为了我的理智,停止以String
格式管理日期/时间值 - 尽快将它们放入适当的容器并从那里管理它们 - 我已经花了一周的时间来处理格式不正确的日期字符串,我简不开心,不开心