在 Java 8 中使用 replaceAll 函数获取日期和时间戳
Using replaceAll function in Java 8 for date and timestamp
我想将两个不同的输入从日期和时间戳设置为最后的 UTC 日期。我不确定使用 replaceAll
函数是否有效。
输入:
- string date = "06/04/2019" 格式为 "MM/dd/yyyy"
- string timestamp = "15/03/2018 15:46:59.000386 PM -05:00" 格式
是 "dd/MM/yyyy hh:mm:ss.SSSSSS a XXX"
输出:
“06/04/2019 15:46:59.000386 PM -05:00” 然后将其转换为 UTC...
执行答案:否,String.replaceAll
无法将您的日期时间或日期转换为 UTC。
Java(尤其是 Java 8 及更高版本)对日期和时间的解析、处理、转换和格式化提供了很好的支持。例如:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
DateTimeFormatter timestampFormatter = DateTimeFormatter
.ofPattern("dd/MM/yyyy hh:mm:ss.SSSSSS a XXX", Locale.ENGLISH);
String dateString = "06/04/2019";
String timestampString = "15/03/2018 03:46:59.000386 PM -05:00";
OffsetDateTime timestampOnDate = OffsetDateTime
.parse(timestampString, timestampFormatter)
.with(LocalDate.parse(dateString, dateFormatter));
System.out.println("Output: " + timestampOnDate.format(timestampFormatter));
System.out.println("Output in UTC: "
+ timestampOnDate.withOffsetSameInstant(ZoneOffset.UTC)
.format(timestampFormatter));
这会打印:
Output: 06/04/2019 03:46:59.000386 PM -05:00
Output in UTC: 06/04/2019 08:46:59.000386 PM Z
您的字符串和格式不太合理,所以我稍微更改了它们:MM/dd
到 dd/MM
,15 PM 到 03 PM,因此也 HH
(一天中的小时)到 hh
(上午或下午的小时)。如果这些更改不正确,只需进行您想要的更改即可。
编辑:当然,如果你坚持,你可以
timestampString = timestampString.replaceFirst("^\d{2}/\d{2}/\d{4}", dateString);
——得到06/04/2019 03:46:59.000386 PM -05:00
,然后像以前一样解析。我认为这段代码的可读性较差,而且它也不会让您首先验证时间戳字符串中的日期。我建议使用 date-time 类 来处理您的日期和时间戳,就像我在代码示例中所做的那样。
只是为了补充上面的其他答案,您也可以先解析 LocalDate
,然后将其与 OffsetTime
结合以创建 OffsetDateTime
:
OffsetDateTime timestampOnDate = LocalDate
// parse date (dd/MM/uuuu)
.parse(dateString, dateFormatter)
// join with time and offset (ignores 15/03/2018)
.atTime(OffsetTime.parse(timestampString, timestampFormatter));
OffsetTime.parse
将创建一个包含时间和偏移量部分的对象(忽略您不想要的日期,在本例中为“15/03/2018”),并使用 LocalDate
生成所需的 OffsetDateTime
.
但不确定哪个代码更好。我想两者是等价的。
replaceAll
可能有效,但前提是 dateString
是有效日期 - 解析时会检查该日期。如果日期字符串包含无效日期,例如35/99/0000,或者其他格式的有效日期,甚至是一些无意义的文本,replaceAll
不会报错结果将是一个不正确的字符串。
但是将这些无效值解析为日期会引发异常,因此最好将数据作为它们真正代表的类型来处理。
我想将两个不同的输入从日期和时间戳设置为最后的 UTC 日期。我不确定使用 replaceAll
函数是否有效。
输入:
- string date = "06/04/2019" 格式为 "MM/dd/yyyy"
- string timestamp = "15/03/2018 15:46:59.000386 PM -05:00" 格式 是 "dd/MM/yyyy hh:mm:ss.SSSSSS a XXX"
输出: “06/04/2019 15:46:59.000386 PM -05:00” 然后将其转换为 UTC...
执行答案:否,String.replaceAll
无法将您的日期时间或日期转换为 UTC。
Java(尤其是 Java 8 及更高版本)对日期和时间的解析、处理、转换和格式化提供了很好的支持。例如:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
DateTimeFormatter timestampFormatter = DateTimeFormatter
.ofPattern("dd/MM/yyyy hh:mm:ss.SSSSSS a XXX", Locale.ENGLISH);
String dateString = "06/04/2019";
String timestampString = "15/03/2018 03:46:59.000386 PM -05:00";
OffsetDateTime timestampOnDate = OffsetDateTime
.parse(timestampString, timestampFormatter)
.with(LocalDate.parse(dateString, dateFormatter));
System.out.println("Output: " + timestampOnDate.format(timestampFormatter));
System.out.println("Output in UTC: "
+ timestampOnDate.withOffsetSameInstant(ZoneOffset.UTC)
.format(timestampFormatter));
这会打印:
Output: 06/04/2019 03:46:59.000386 PM -05:00
Output in UTC: 06/04/2019 08:46:59.000386 PM Z
您的字符串和格式不太合理,所以我稍微更改了它们:MM/dd
到 dd/MM
,15 PM 到 03 PM,因此也 HH
(一天中的小时)到 hh
(上午或下午的小时)。如果这些更改不正确,只需进行您想要的更改即可。
编辑:当然,如果你坚持,你可以
timestampString = timestampString.replaceFirst("^\d{2}/\d{2}/\d{4}", dateString);
——得到06/04/2019 03:46:59.000386 PM -05:00
,然后像以前一样解析。我认为这段代码的可读性较差,而且它也不会让您首先验证时间戳字符串中的日期。我建议使用 date-time 类 来处理您的日期和时间戳,就像我在代码示例中所做的那样。
只是为了补充上面的其他答案,您也可以先解析 LocalDate
,然后将其与 OffsetTime
结合以创建 OffsetDateTime
:
OffsetDateTime timestampOnDate = LocalDate
// parse date (dd/MM/uuuu)
.parse(dateString, dateFormatter)
// join with time and offset (ignores 15/03/2018)
.atTime(OffsetTime.parse(timestampString, timestampFormatter));
OffsetTime.parse
将创建一个包含时间和偏移量部分的对象(忽略您不想要的日期,在本例中为“15/03/2018”),并使用 LocalDate
生成所需的 OffsetDateTime
.
但不确定哪个代码更好。我想两者是等价的。
replaceAll
可能有效,但前提是 dateString
是有效日期 - 解析时会检查该日期。如果日期字符串包含无效日期,例如35/99/0000,或者其他格式的有效日期,甚至是一些无意义的文本,replaceAll
不会报错结果将是一个不正确的字符串。
但是将这些无效值解析为日期会引发异常,因此最好将数据作为它们真正代表的类型来处理。