Java - SimpleDateFormat formatter to return epoch time with milliseconds
我是Java和编码的新手 - 我有一些代码以下列格式
1 |
返回:
1 | 2017.07.19 11:42:30:423 |
有没有办法编辑上面的"SimpleDateFormat格式化程序"代码,将日期/时间作为包含毫秒的纪元时间戳返回,以便返回的值按照下面的格式进行格式化?
1 | 1500464550423 |
我希望我可以修改
非常感谢任何帮助或建议。
谢谢
在格式模式字符串中使用大小写时遇到一个简单的错误(这些区分大小写)。更糟糕的是,你正在使用旧的麻烦的
所以我建议您使用现代Java日期和时间API(我故意使用您的格式模式字符串逐字):
1 2 3 4 5 |
此代码抛出
1 2 | DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS"); |
现在代码打印
要转换为毫秒,我们仍然缺少一个重要的信息:在什么时区应该解释时间戳?我认为两个明显的猜测是UTC和你当地的时区(我不知道)。试试UTC:
1 |
这会产生
如果您想要JVM的时区设置,请使用
首先,查看
无论如何,
1 2 3 4 5 6 7 8 9 | // input string String s ="2017.07.19 11:42:30:423"; // use correct format ('S' for milliseconds) SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:SSS"); // parse to a date Date date = formatter.parse(s); // get epoch millis long millis = date.getTime(); System.out.println(millis); // 1500475350423 |
问题是
1 2 | // set a timezone to the formatter (using UTC as example) formatter.setTimeZone(TimeZone.getTimeZone("UTC")); |
这样,
要执行相反的操作(从millis值创建日期),您必须创建一个
1 2 3 4 5 6 7 | // create date from millis Date date = new Date(1500464550423L); // use correct format ('S' for milliseconds) SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:SSS"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); // format date String formatted = formatter.format(date); |
Java新的日期/时间API
旧类(
如果您使用的是Java 8,请考虑使用新的java.time API。与旧的API相比,它更容易,更少出错并且更不容易出错。
如果您使用Java <= 7,则可以使用ThreeTen Backport,这是Java 8的新日期/时间类的一个很好的后端。对于Android,还有ThreeTenABP(更多关于如何在这里使用它)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中是
由于输入
1 2 3 4 5 6 7 8 9 10 11 | // input string String s ="2017.07.19 11:42:30:423"; // use correct format ('S' for milliseconds) DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS"); // as the input string has no timezone information, parse it to a LocalDateTime LocalDateTime dt = LocalDateTime.parse(s, formatter); // convert the LocalDateTime to a timezone ZonedDateTime zdt = dt.atZone(ZoneId.of("Europe/London")); // get the millis value long millis = zdt.toInstant().toEpochMilli(); // 1500460950423 |
该值现在
请注意,API使用IANA时区名称(始终采用
避免使用3个字母的缩写(如
您可以通过调用
如果要使用UTC,也可以使用
相反,您可以获取millis值来创建Instant,将其转换为时区并将其传递给formatter:
1 2 3 4 5 6 7 8 | // create Instant from millis value Instant instant = Instant.ofEpochMilli(1500460950423L); // use correct format ('S' for milliseconds) DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS"); // convert to timezone ZonedDateTime z = instant.atZone(ZoneId.of("Europe/London")); // format String formatted = z.format(formatter); |
你可以试试
1 |
1 2 3 4 |
第一个建议是转移到java8 java.time API而不是学习损坏的java.date API
然后做:
1 2 |
在你的情况下你可以做:
1 2 3 | LocalDateTime myldt = LocalDateTime.parse("2017-06-14 14:29:04", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(myldt.toInstant(ZoneOffset.UTC).toEpochMilli()); |
请注意,只要您使用api玩更多内容,您就会找到更多方法来实现相同的目标,最后您将结束调用toEpochMilli
如果你有
1 2 3 4 5 6 7 8 9 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:sss"); Date dateToBeFormatted = new Date(); // this will print a datetime literal on the above format System.out.println(formatter.format(dateToBeFormatted)); // this will print the number of millis since the Java epoch System.out.println(dateToBeFormatted.getTime()); |
这里的关键点是,为了获得自纪元以来的毫秒数,您不需要