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