java - 用可变的纳秒数解析 Java 中的时间戳字符串

标签 java time

我有一个 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

DateSimpleDateFormatterCalendar 类是 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/

相关文章:

PHP round time() 向上( future )到下一个 5 分钟的倍数

java - Spark 2.2.0 API : Which one should i prefer Dataset with Groupby combined with aggregate or RDD with ReduceBykey

java - 如何使用 Spring Social 1.1.0 发送应用程序邀请

java - 在 Java/Android 中引入变量哪种更好?

c - C 中的日期/时间到 time_t

c++ - Linux:GetDateFormat() 和 GetTimeFormat() 是否存在 C++?

java - JShell - 如何在不替换此类的情况下向现有类添加方法?

java - 将图像文件与 Swing TransferHandler 一起使用

.net - .NET WinForms 的仅时间选择器?

matlab - 在 MATLAB 中,给定数据向量,查找阈值内的零交叉