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

用可变纳秒数解析Java中的时间戳字符串,java,time,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.SSX yyyy MM dd HH:MM:ss.SSSX yyyy MM dd HH:MM:ss.SSX 如何解析可能包含上述任何一种格式的字符串 以下代码可以在存在3-6纳秒时解析时间戳,但在纳秒不存在或小于3纳秒时解析失败:

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

yyyy MM dd HH:MM:ss.SSSX

yyyy MM dd HH:MM:ss.SSX

如何解析可能包含上述任何一种格式的字符串

以下代码可以在存在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和TIME ZONE,并显示为截断尾随的“0”纳秒位置


我使用的是Java 8,并对任何外部库开放(Joda?)。

前19个字符是相同的


此外,在不同的情况下,您有不同的
长度。您可以使用
开关
测试
字符串的
长度
,并针对不同的可能值处理单独的
大小写。

前19个字符相同


此外,在不同的情况下,您有不同的
长度。您可以使用
开关
测试
字符串的
长度
,并为不同的可能值处理单独的
大小写。

我不确定,但类似的方法似乎对我有效:

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());

一般来说,您希望使用尽可能长的格式,在这种情况下使用6x
S

我不确定,但类似的内容似乎适合我:

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());

通常,您希望使用尽可能长的格式,在这种情况下使用6x
S

您最好使用Java.Time包中的Java时间API1

日期
简化格式
日历
类已经过时

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());
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=新的DateTimeFormatterBuilder()
.appendPattern(“yyyy-MM-dd HH:MM:ss.”)
.appendFraction(ChronoField.NANO_/u秒,1,9,false)
.附录模式(“X”)
.toFormatter();
//单项:
LocalDateTime日期=LocalDateTime.parse(“2018-11-02 11:39:03.73562-04”,f);
//多个项目:
列表日期=数组.asList(dateStrs).stream()
.map(t->LocalDateTime.parse(t,f))
.collect(Collectors.toList());


1 Java 8新的日期和时间API严重受Joda Time的影响。事实上,主要作者是Stephen Colebourne,《Joda Time》的作者。

您最好使用Java.Time软件包中的Java时间API1

日期
简化格式
日历
类已经过时

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());
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=新的DateTimeFormatterBuilder()
.appendPattern(“yyyy-MM-dd HH:MM:ss.”)
.appendFraction(ChronoField.NANO_/u秒,1,9,false)
.附录模式(“X”)
.toFormatter();
//单项:
LocalDateTime日期=LocalDateTime.parse(“2018-11-02 11:39:03.73562-04”,f);
//多个项目:
列表日期=数组.asList(dateStrs).stream()
.map(t->LocalDateTime.parse(t,f))
.collect(Collectors.toList());


1 Java 8新的日期和时间API严重受Joda Time的影响。事实上,主要作者是《Joda Time》的作者斯蒂芬·科尔伯恩。

效率是一个衡量标准,很少能在使用之外给出。如果您担心空间或时间的使用,您应该进行基准测试。如果这是一个关键部分,那么首先要使代码可维护,然后再进行基准测试。这可能是离题的,部分原因是没有代码,部分原因是询问API建议是离题的,部分原因是这里没有关于代码的问题。这不是离题。它需要解析上述可能字符串集的代码。问题的焦点不是效率。我已经从问题中删除了“最有效”,但这可能不会比我当前的解决方案更好地鼓励回答。显示a,也许它会更接近主题。或者,如果您有一个工作示例,但只希望对其进行审查,则有一个SE(如果您所拥有的满足该SE的标准)。正如您所看到的,这种类型的开放式问题将导致低质量的答案。MCVE有关有问题的代码的问题-我在问如何做一些事情。这个问题完全不知道我的代码。我建议你避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天,我们有了更好的技术。效率是一个在使用之外很少能给出的指标。如果您担心空间或时间的使用,您应该进行基准测试。如果这是一个关键部分,那么首先要使代码可维护,然后再进行基准测试。这可能与主题无关,部分原因是没有代码,部分原因是询问API建议与主题无关,部分原因是这里没有关于代码的问题