如何将带有毫秒的模糊时间戳转换为java日期

如何将带有毫秒的模糊时间戳转换为java日期,java,datetime-format,Java,Datetime Format,我的时间戳为11月29日06.05.41.831000000 AM 使用SimpleDataFormat,我无法真正提取毫秒(.831000000)…831是毫秒(我不知道为什么是000000。但这来自不同的来源。对此没有控制。)如果时间戳由字符串表示,则可以使用正则表达式解析出额外的零。额外的数字是纳秒。不能将这些包含在SimpleDataFormat或标准库中。在您的情况下,最简单的方法是在解析日期/时间之前删除它们。一个有效的解决方案。。。正如您所看到的,这是一个相当严格的正则表达式 St

我的时间戳为11月29日06.05.41.831000000 AM


使用SimpleDataFormat,我无法真正提取毫秒(.831000000)…831是毫秒(我不知道为什么是000000。但这来自不同的来源。对此没有控制。)

如果时间戳由字符串表示,则可以使用正则表达式解析出额外的零。

额外的数字是纳秒。不能将这些包含在SimpleDataFormat或标准库中。在您的情况下,最简单的方法是在解析日期/时间之前删除它们。

一个有效的解决方案。。。正如您所看到的,这是一个相当严格的正则表达式

String input = "29-NOV-11 06.05.41.831000000 AM";

input = input
        .replaceFirst(
                "(\\d+-\\w+-\\d+\\s\\d+\\.\\d+\\.\\d+\\.\\d{3})\\d{6}(\\s(\\w+))",
                "$1$2");
try {
    SimpleDateFormat sdf = new SimpleDateFormat(
            "dd-MMM-yy HH.mm.ss.SSS aa");

    Date date = sdf.parse(input);
    System.out.println(sdf.format(date));

} catch (ParseException e) {
    e.printStackTrace();
}

如果字符串总是固定宽度,则可以使用SUBR,并且考虑正则表达式有点过头。

input = input.substring(0, 22) + input.substring(28, 31);
java.time 使用UTC的时区偏移量将日期时间字符串解析为
OffsetDateTime
,并将结果转换为
即时

您可以使用将
瞬间
转换为毫秒

演示:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .appendPattern("d-MMM-uu h.m.s.n a")
                                .toFormatter(Locale.ENGLISH)
                                .withZone(ZoneOffset.UTC);
        
        OffsetDateTime odt = OffsetDateTime.parse("29-NOV-11 06.05.41.831000000 AM", dtf);
        Instant instant = odt.toInstant();
        long millis = instant.toEpochMilli();
        System.out.println(millis);
    }
}
1322546741831
输出:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .appendPattern("d-MMM-uu h.m.s.n a")
                                .toFormatter(Locale.ENGLISH)
                                .withZone(ZoneOffset.UTC);
        
        OffsetDateTime odt = OffsetDateTime.parse("29-NOV-11 06.05.41.831000000 AM", dtf);
        Instant instant = odt.toInstant();
        long millis = instant.toEpochMilli();
        System.out.println(millis);
    }
}
1322546741831
了解有关*的更多信息


*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

您必须小心,不要移动过多的数字。e、 g.41.831是41秒和831毫秒,但41.83是42秒和83毫秒,41.8被解析为41秒和8毫秒。Yeh..它的字符串…问题是那些尾随的零…如何使用正则表达式将它们转换为mill+微秒或仅微秒?我需要那些毫秒(还有后面的AM/PM)@choban它,因为它将
/
-
作为分隔符。它不能将
识别为一个特殊的分隔符,这意味着它后面跟着一个小数。这就是0.8310不起作用的原因,它可以变成更有意义的
8.310
。我可以看到,为了更好地理解核心类,我把更多的单元测试放在一起。