我有一个 CSV,其中包含以下格式的时间戳:
yyyy-MM-dd HH:mm:ssX
yyyy-MM-dd HH:mm:ss.SX
yyyy-MM-dd HH:mm:ss.SSX
yyyy-MM-dd HH:mm:ss.SSSX
yyyy-MM-dd HH:mm:ss.SSSSX
yyyy-MM-dd HH:mm:ss.SSSSSX
yyyy-MM-dd HH:mm:ss.SSSSSSX
如何解析可能包含上述任何一种格式的字符串?
以下代码可以在存在 3-6 纳秒时解析时间戳,但在纳秒不存在或小于 3 时解析失败:
String time = "2018-11-02 11:39:03.0438-04";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX");
Date date = sdf.parse(time);
System.out.println("Date and Time: " + date.getTime());
我目前有一个从 0-6 迭代并生成一个字符串的方法,其中“S”的数量等于迭代变量的值。该方法尝试在 try/catch 中解析字符串,直到成功解析字符串。例如,字符串 2018-11-02 11:39:03.0438-04
将尝试解析五次才能成功。
CSV 是 PostgreSQL 表的导出,该表包含类型为 TIMESTAMP WITH TIME ZONE 的列,并且似乎截断了尾随“0”纳秒的位置。
我正在使用 Java 8,并且对任何外部库(Joda?)开放。
最佳答案
您最好使用 java.time
包中的 Java Time API1。
Date
、SimpleDateFormatter
和 Calendar
类是 flawed并且已过时。
DateTimeFormatter
类提供了大量选项,因此您可以配置所需的所有选项。请注意,通过使用 appendFraction
方法,纳诺会向右填充。
String[] dateStrs = {
"2018-11-02 11:39:03.4-04",
"2018-11-02 11:45:22.71-04",
"2018-11-03 14:59:17.503-04"
};
DateTimeFormatter f = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss.")
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, false)
.appendPattern("X")
.toFormatter();
// Single item:
LocalDateTime date = LocalDateTime.parse("2018-11-02 11:39:03.7356562-04", f);
// Multiple items:
List<LocalDateTime> dates = Arrays.asList(dateStrs).stream()
.map(t -> LocalDateTime.parse(t, f))
.collect(Collectors.toList());
<小时/>
1 Java 8 新的日期和时间 API 深受 Joda Time 的影响。事实上,主要作者是《Joda Time》的作者 Stephen Colebourne。
关于java - 用可变的纳秒数解析 Java 中的时间戳字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192032/