如何从添加 hh:mm 的特定字符串中获取本地时间

Posted

技术标签:

【中文标题】如何从添加 hh:mm 的特定字符串中获取本地时间【英文标题】:How to get local time from a specific string adding hh:mm 【发布时间】:2019-01-25 17:46:04 【问题描述】:

我有这个格式的日期:

String date = "2018-12-08T07:50:00+01:00";

我想以这种格式获取当地时间(添加格林威治标准时间的小时数),但我做不到

date = "2018-12-08 08:50:00";

其他例子:

String date = "2018-12-08T07:50:00+04:00";

结果:

date = "2018-12-08 11:50:00";

有什么帮助吗?

【问题讨论】:

类似于Convert OffsetDateTime to UTC Timestamp(虽然可能不是严格的重复)。不过,我认为您应该能够从搜索引擎为您带来的内容中拼凑出答案。 【参考方案1】:

正如 Sun 在 another answer 中所说,您误解了:2018-12-08T07:50:00+01:00 与 UTC 中的 2018-12-08 06:50:00 时间点相同(与 GMT 大致相同),而不是 08:50+01:00 表示时间来自时钟比 UTC 早 1 小时的地方,因此要获得 UTC 时间,应该减去 1 小时,而不是添加。

    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String date = "2018-12-08T07:50:00+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    OffsetDateTime dateTimeInUtc = dateTime.withOffsetSameInstant(ZoneOffset.UTC);
    date = dateTimeInUtc.format(desiredFormatter);
    System.out.println(date);

这个 sn-p 的输出是:

2018-12-08 06:50:00

使用你的另一个例子,2018-12-08T07:50:00+04:00,输出是

2018-12-08 03:50:00

我正在利用您的字符串采用 ISO 8601 格式这一事实。 OffsetDateTime 将此格式解析为默认格式,也就是说,我们不需要在 DateTimeFormatter 中指定格式(就像我们为您想要的结果格式所做的那样)。

链接: Wikipedia article: ISO 8601

【讨论】:

【参考方案2】:

2018-12-08T07:50:00+01:00,后面的+01:00不代表adding hh:mm,表示日期时间已经是本地日期时间,GMT是2018-12-08T06:50:00

您可以使用string.replaceAll 删除T+01:00

String input = "2018-12-08T07:50:00+01:00";
input = input.replaceAll("T", " ");
input = input.replaceAll("\\+.*", "");
System.out.println(input);  // 2018-12-08 07:50:00

或解析并重新格式化:

OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-12-08T07:50:00+01:00");
String time = offsetDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T", " ");
System.out.println(time); // 2018-12-08 07:50:00

【讨论】:

与使用正则表达式的低级字符串操作相比,我显然更喜欢解析和重新格式化。无论如何,还应该将日期时间存储在OffsetDateTime 类型的变量中。 @OleV.V.如果结果只是针对 UI,那么这两种方法没有区别。否则首选第二个。

以上是关于如何从添加 hh:mm 的特定字符串中获取本地时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中以字符串格式获取当前时间戳? “yyyy.MM.dd.HH.mm.ss”

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

如何将 yyyy/MM/dd hh:mm:ss 转换为秒?

从奇数Dd HH:MM:SS.mm格式中提取时间数据[关闭]

如何获取 IST 格式的当前系统时间并将其与 HH:mm:ss 格式的时间(字符串数据类型)进行比较? java语言的解决方案

如何睡到特定时间 YYYY-MM-DD HH:MM:SS?