如何使用LocalDateTime从Java8中的字符串创建以毫秒为单位的长时间?
我有一个格式为如何使用LocalDateTime从Java8中的字符串创建以毫秒为单位的长时间?,datetime,java-8,java-time,Datetime,Java 8,Java Time,我有一个格式为yyyy-MM-dd\u HH:MM:ss.SSS的输入日期,并通过以下方式将其转换为long: SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS"); try { Date date = simpleDateFormat.parse(lapTime); time = date.getTime(); } catch
yyyy-MM-dd\u HH:MM:ss.SSS
的输入日期,并通过以下方式将其转换为long:
SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS");
try {
Date date = simpleDateFormat.parse(lapTime);
time = date.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
并且,经过一些操作后,从long中获取mm:ss.SSS
:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss.SSS");
return simpleDateFormat.format(new Date(time));
如何将我的旧式代码更改为Java8?
我查看了LocalDateTime
和Instant
类,但不知道如何正确使用它们。您可以使用输入格式的日期创建,然后转换为with zone以提取历元时间戳
String date = "2019-12-13_09:23:23.333";
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss.SSS");
long mills = LocalDateTime.parse(date,formatter)
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
System.out.println(mills);
tl;博士
ISO 8601
在解析/生成字符串时,您的输入字符串几乎符合java.time类中默认使用的标准ISO 8601格式
要完全符合要求,只需将下划线\uu
I.中间替换为大写的T
String input = "2019-12-13_09:23:23.333".replace( "_" , "T" ) ;
无需解析和格式化程序
LocalDateTime ldt = LocalDateTime.parse( input ) ;
指定此日期和时间的时区。该数据的发布者是打算当天上午9点在日本东京,还是说美国俄亥俄州托莱多的上午9点?那将是两个不同的时刻,相隔几个小时
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
提取一个即时
以调整为UTC。以UTC为单位询问自1970年第一时刻起的毫秒数
long milliseconds = zdt.toInstant().toEpochMilli() ;
我尝试了你的解决方案,但与之前的计算结果不符。例如,前面我收到1527152472434,现在是1527152472,所以我认为这里SSS是丢失的,欢迎使用堆栈溢出。你的搜索结果是什么?在哪些方面是不足的还是失败的?在这种情况下,我们可以更准确地帮助您。再问问你自己,你是否想保持毫秒数。我会保留
LocalDateTime
,而不需要Milli(或者ZonedDateTime
或OffsetDateTime
来定义时间点)。虽然LocalDateTime
告诉您它是一个日期和时间,但long
是低级的,它不告诉您该值的含义。
long milliseconds = zdt.toInstant().toEpochMilli() ;