gpt4 book ai didi

java - 使用年份和不同的亚秒位数解析 LocalDateTime

转载 作者:行者123 更新时间:2023-12-04 15:56:22 29 4
gpt4 key购买 nike

我有使用年份和一年中的某一天 (1-365/366) 加上一天中的时间的数据,例如 2018-338T14:02:57.47583,而不是年月日。

我正在尝试编写一个输入时间戳的函数,它通过一堆正则表达式运行它,并返回一个模式,我可以使用该模式通过 LocalDateTime.parse 解析该时间戳。我有一个功能可以做到这一点,除了一个问题。

public static String getInputFormat(String rawFirst) {

String first = rawFirst.replaceAll("[^-.:/ a-zA-Z0-9]", "");

ImmutableMap<String, String> regexFormatMap = new ImmutableMap.Builder<String, String>()
.put("(-)?[0-9]{4}(Z?)", "YYYY")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)", "yyyy-DDD'T'HH:mm")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:(([0-5][0-9])|60)(\\.([0-9]{1,6}))?(Z?)", "yyyy-DDD'T'HH:mm:ss.SSSSS")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)(([0-1][0-9])|(2[0-4]))(Z?)", "yyyy-DDD'T'HH")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)24((:00)|(:00:00))?(Z?)", "yyyy-DDD'T'HH:mm:ss")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)24:00:00(\\.([0]{1,6}))(Z?)", "yyyy-DDD'T'HH:mm:ss")
.put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(Z?)", "yyyy-DDD")
.build();

for (String regex : regexFormatMap.keySet()) {
System.out.println(first.matches(regex) + ": " + first + " fits " + regex);
if (first.matches(regex)) {
System.out.println("Returning pattern " + regexFormatMap.get(regex));
return regexFormatMap.get(regex);
}
}

System.out.println("did not match pattern, returning default pattern used with test data, eventually this should just fail.");
return "yyyy-DDD'T'HH:mm:ss.SSSSS";
}

我不知道如何处理任意数量的亚秒位数,即,

  • “2018-338T14:02:57.47583”
  • “2018-338T14:02:57.475835”
  • “2018-338T14:02:57.4758352”
  • “2018-338T14:02:57.47583529”

等等

我想以尽可能一般的方式执行此操作,因此理想情况下我不会检查每种可能性。

一种解决方案是让输出格式字符串有九个亚秒数字,然后填充输入字符串,但问题是检查是否应该填充它以及填充多少变得非常笨重。我希望它能够处理各种各样的字符串,并且只需向正则表达式映射添加更多条目即可扩展,而不是在其他地方添加复杂性和特殊情况。

也许我不能在这里得到我想要的一切,但如果你能想到一个解决方案,我会很高兴。谢谢!

最佳答案

您可以使用 u-D'T'H:m:s[.[SSSSSSSSS][SSSSSSSS][SSSSSSS][SSSSSS][ 而不是使用复杂且容易出错的 RegEx 解决方案SSSSS][SSSS][SSS][SS][S]] 作为带有 DateTimeFormatter 的模式,允许在方括号内指定可选模式。

演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
"u-D'T'H:m:s[.[SSSSSSSSS][SSSSSSSS][SSSSSSS][SSSSSS][SSSSS][SSSS][SSS][SS][S]]", Locale.ENGLISH);

// Test
Stream.of(
"2018-338T14:02:57.47583",
"2018-338T14:02:57.475835",
"2018-338T14:02:57.4758352",
"2018-338T14:02:57.47583529"
).forEach(s -> System.out.println(LocalDateTime.parse(s, dtf)));
}
}

输出:

2018-12-04T14:02:57.475830
2018-12-04T14:02:57.475835
2018-12-04T14:02:57.475835200
2018-12-04T14:02:57.475835290

ONLINE DEMO

了解有关 modern Date-Time API 的更多信息* 来自 Trail: Date Time 。查看 this answerthis answer了解如何将 java.time API 与 JDBC 一起使用。


* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring .请注意,Android 8.0 Oreo 已经提供了support for java.time .

关于java - 使用年份和不同的亚秒位数解析 LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69854895/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com