0

我试图从给定时间删除分钟,但它如何将时间转换为我的本地时区

String timeStamp="20180623 05:58:15" ;   
dateFormat inputFormatter = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
                Date date = inputFormatter.parse(timeStamp); 
                date.setMinutes(-2);
                logger.info("Before converting : "+date);
                DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); 

在这里它转换为我的当地时间并从给定时间减去 2 分钟,但我不想在这里检查时区,我给它的任何时间都应该减去 2 分钟。

4

1 回答 1

3

从了解如何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格式管理日期/时间值 - 尽快将它们放入适当的容器并从那里管理它们 - 我已经花了一周的时间来处理格式不正确的日期字符串,我简不开心,不开心

于 2018-06-23T00:34:24.970 回答