在Java 8中,将时间转换为毫秒的正确方法是什么?

27

我一直在尝试使用Java 8中内置的java.time包将“DateTime”转换为毫秒。

但我一直没有做对。我正在尝试将“29/Jan/2015:18:00:00”转换为毫秒。以下是我尝试过的代码:

Instant instant = Instant.parse("2015-01-29T18:00:00.0z");
Long instantMilliSeconds = Long.parseLong(instant.getEpochSecond() + "" + instant.get(ChronoField.MILLI_OF_SECOND));
System.out.println(new Date(instantMilliSeconds)); // prints Sun Jun 14 05:06:00 PDT 1970

我尝试使用LocalDateTime,但无法有效地将其转换为毫秒。我并不是说这是最好的方法,如果你知道更好的方法,我会非常感激一些指示。


可能是Java字符串转日期转换的重复问题。 - vanza
可能是如何在Java 8中从LocalDateTime获取毫秒的重复问题。 - Vadzim
3个回答

49

您应该使用Instant::toEpochMilli


System.out.println(instant.toEpochMilli());
System.out.println(instant.getEpochSecond());
System.out.println(instant.get(ChronoField.MILLI_OF_SECOND));

打印

1422554400000
1422554400
0

你的版本不起作用是因为你忘记给instant.get(ChronoField.MILLI_OF_SECOND)添加额外的零来填充到3位。


谢谢,"toEpochMilli" 对我很有帮助,但是我需要将 ""29/Jan/2015:18:00:00"" 转换成 ""2015-01-29T18:00:00.0z" 格式才能与 Instant 类一起使用。我很好奇将 "29/Jan/2015:18:00:00" 转换为毫秒的最佳方法是什么。 - Seagull
4
请提出另一个问题,我相信会有人能够帮助你。请参考:Ask another question - Jeffrey

3

来自日期和时间类教程...

DateTimeFormatter formatter
                    = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss");
LocalDateTime date = LocalDateTime.parse("29/Jan/2015:18:00:00", formatter);
System.out.printf("%s%n", date);

打印出 2015-01-29T18:00

ZoneId id = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.of(date, id);
System.out.println(zdt.toInstant().toEpochMilli());

打印 1422514800000


谢谢您的时间,我当然可以自己做这个,但我正在寻找更简洁的东西。我发布的答案基本上就是我想要的。 - Seagull
@Seagull 除了通过方法链接对象创建之外,它们是相同的...除了你可以将其缩减为一行代码,但你会失去可读性...你还会失去可重用性,但这只是我的看法... - MadProgrammer
你说得没错,通过方法链式调用会降低可读性,但是归根结底,我想找到一种用更少的代码实现更多功能的方法。我觉得我的解决方案做到了这一点,因为它只涉及较少的类。 - Seagull
可以说你仍然使用了相同数量的类,只是将它们封装在方法调用中。我们可能会花费余生来争论它是否更高效,但这让我有机会更多地探索API :P - MadProgrammer
与主题无关。我喜欢MadProgrammer关于失去可读性的评论。非常正确,我想知道您对Java stream() API有何看法,将这些方法链接起来是否会让代码难以理解。 - Vortex

1

好的,我想我终于找到了一个简单的方法来做我想做的事情。

LocalDateTime localDateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("dd/MMM/uuuu:H:m:s"));
System.out.println(localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli());

打印1390903200000


这里有另一个链接,它很好地解释了在这里需要做什么。 - Seagull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接