Java 如何在不考虑时区的情况下从给定时间字符串中删除第 n 分钟

Java how to remove nth minute from given time string without considering time zone

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

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 分钟。

首先了解 Date 的工作原理。当你做...

logger.info("Before converting : "+date);

Date class 使用它的 toString 方法将 Date class 表示的 date/time 信息格式化为人类可读格式。反正 "convert" date/time 值

所以从上面获取你的代码(并对其进行修改以使其工作),它输出...

Before converting : Sat Jun 23 04:58:15 AEST 2018
20180623 04:58:15

在我的机器上 - 为什么值相同?因为输入没有任何时区信息,所以时间可能被视为机器本地时区(并且该值只是为了输出而格式化)。

Date 只是自 Unix 纪元以来的毫秒数的容器,它与格式无关——这意味着它不携带格式信息。

Date 也实际上已弃用 - 更不用说 setDate 也已被弃用

总体上更好的(起点)是使用 Java 8 中引入的较新的 date/time API(对于早期版本的 back port support 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

输入和输出仍然被认为是在机器本地时区。

but I don`t want to check the time zone here instead, what ever time I give it should just subtract 2 minutes

请记住,API 仍然需要一些时区概念,无论是本地时区还是 UTC/GMT,但由于您的输入不提供任何类型的信息,您需要选择 "how" 来最好地处理该问题。上面的示例只是 "assumes" 当地时间,但您可以使用 ZonedDateTime 并将其转换为执行操作的 "common" 时区,或者更好的是,让所有字符串都带有时区资讯

哦,为了我的理智,停止管理 String 格式的 date/time 值 - 尽快将它们放入适当的容器中并从那里管理它们 - 我已经花了一个星期的时间来处理格式不当的日期字符串,我不开心简,不开心