如何使用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() ;