我有格式2017-18-08 11:45:30.345的时间戳。

我想将它转换为纪元时间,所以我在下面做:

String timeDateStr ="2017-18-08 11:45:30.345";

DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss.SSS");

ZonedDateTime     zdt  = ZonedDateTime.parse(timeDateStr, dtf);

System.out.println(zdt.toInstant().toEpochMilli());

我收到以下错误:

java.time.format.DateTimeParseException: Text '2017-18-08 11:45:30.345' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor

我也尝试过不同的格式,但仍然会出错。

这是错字请检查更新的问题。 谢谢你的指点。

@Assafs不,不是唯一的错误。 请看模式符号"h"。

@ User7723337分钟是60?

你解决了这个问题吗?

当此模式没有关于时区的信息时,ZonedDateTime是否有效?

注意:最初问题的输入是2017-18-08 12:60:30.345(在分钟字段中有60),然后它被编辑(时间从12:60更改为11:45),但我决定保持这个答案讨论关于原始输入(12:60),因为它也适用于编辑版本(11:45)。

ZonedDateTime需要时区或偏移量,但输入String没有它(它只有日期和时间)。

输入中还有另一个细节:

分钟值是60,不接受:有效值从0到59(实际上有一种方法可以接受这个,请参阅下面的"宽容解析")

hh是mid-hour-am-pm字段,因此它还需要完全解析AM / PM指示符。由于您没有它,您应该使用hh模式

所以模式必须是yyyy-dd-MM HH:mm:ss.SSS,输入不能有60作为分钟值(除非你使用宽松解析,我将在下面解释),你不能直接将它解析为ZonedDateTime,因为它没有时区/偏移指示符。

一种替代方法是将其解析为LocalDateTime,然后定义此日期所在的时区/偏移量。在下面的例子中,我假设它是UTC:

// change 60 minutes to 59 (otherwise it doesn't work)

String timeDateStr ="2017-18-08 12:59:30.345";

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss.SSS");

// parse to LocalDateTime

LocalDateTime dt = LocalDateTime.parse(timeDateStr, dtf);

// assume the LocalDateTime is in UTC

Instant instant = dt.toInstant(ZoneOffset.UTC);

System.out.println(instant.toEpochMilli());

这将输出:

1503061170345

这相当于UTC中的2017-18-08 12:59:30.345。

如果您希望在另一个时区中使用日期,则可以使用ZoneId类:

// get the LocalDateTime in some timezone

ZonedDateTime z = dt.atZone(ZoneId.of("Europe/London"));

System.out.println(z.toInstant().toEpochMilli());

输出是:

1503057570345

请注意,结果是不同的,因为相同的本地日期/时间表示每个时区中的不同Instant(在世界的每个部分中,本地日期/时间2017-18-08 12:59:30.345发生在不同的时刻)。

另请注意,API使用IANA时区名称(始终采用Region/City格式,如America/Sao_Paulo或Europe/Berlin)。

避免使用3个字母的缩写(如CST或PST),因为它们不明确且不标准。

您可以通过调用ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区)。

您也可以将系统的默认时区与ZoneId.systemDefault()一起使用,但即使在运行时也可以在不事先通知的情况下进行更改,因此最好明确使用特定的时区。

还可以选择将LocalDateTime转换为偏移量(如-05:00或+03:00):

// get the LocalDateTime in +03:00 offset

System.out.println(dt.toInstant(ZoneOffset.ofHours(3)).toEpochMilli());

输出将等于偏移量+03:00中的本地日期/时间(比UTC早3小时):

1503050370345

宽松解析

正如@MenoHochschild在评论中提醒我的那样,你可以使用宽松的解析来接受分钟字段中的60(使用java.time.format.ResolverStyle类):

String timeDateStr ="2017-18-08 12:60:30.345";

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss.SSS")

// use lenient parsing

.withResolverStyle(ResolverStyle.LENIENT);

// parse to LocalDateTime

LocalDateTime dt = LocalDateTime.parse(timeDateStr, dtf);

在这种情况下,60分钟调整到下一个小时,LocalDateTime将是:

2017-08-18T13:00:30.345

夏令时

如果您决定使用UTC或固定偏移量(使用ZoneOffset类),则可以忽略此部分。

但是,如果您决定使用时区(ZoneId类),则还必须处理DST(夏令时)问题。我将使用我居住的时区作为示例(America/Sao_Paulo)。

在圣保罗,夏令时开始于2017年10月15日:午夜,时钟从午夜向凌晨1点转移到凌晨1点。因此,此时区内不存在00:00至00:59之间的所有当地时间。如果我在此间隔中创建本地日期,则会将其调整为下一个有效时刻:

ZoneId zone = ZoneId.of("America/Sao_Paulo");

// October 15th 2017 at midnight, DST starts in Sao Paulo

LocalDateTime d = LocalDateTime.of(2017, 10, 15, 0, 0, 0, 0);

ZonedDateTime z = d.atZone(zone);

System.out.println(z);// adjusted to 2017-10-15T01:00-02:00[America/Sao_Paulo]

夏令时结束时:2018年2月18日午夜,时钟从17日午夜到晚上23点转移1小时。因此,从23:00到23:59的所有当地时间都存在两次(在DST和非DST中),您必须决定您想要哪一个:

// February 18th 2018 at midnight, DST ends in Sao Paulo

// local times from 23:00 to 23:59 at 17th exist twice

LocalDateTime d = LocalDateTime.of(2018, 2, 17, 23, 0, 0, 0);

// by default, it gets the offset before DST ends

ZonedDateTime beforeDST = d.atZone(zone);

System.out.println(beforeDST); // before DST end: 2018-02-17T23:00-02:00[America/Sao_Paulo]

// get the offset after DST ends

ZonedDateTime afterDST = beforeDST.withLaterOffsetAtOverlap();

System.out.println(afterDST); // after DST end: 2018-02-17T23:00-03:00[America/Sao_Paulo]

请注意,DST结束前后的日期具有不同的偏移量(-02:00和-03:00)。这会影响epochMilli的价值。

您必须检查DST何时开始并以您选择的时区结束,并相应地检查调整。

你是唯一一个同时看到h与H错误的回答者(因此也就是upvoting)。 关于分钟= 60-值:嗯,宽松的解析(通过构建器)可以解决这个问题(没有测试,但我想,然后解析器将选择下一分钟,即下一小时和分钟=零)。

@MenoHochschild我通常避免使用宽松的解析,因为我不喜欢这些自动转换。 但我已经测试过,它将时间调整为13:00:30.345。 我已经更新了答案,非常感谢!

很棒的答案!恭喜。

他的ZonedDateTime变量无法工作,因为sis模式没有关于时区的信息,不是吗?

更正了有关yyyy-dd-MM的代码。微小的值也可能是1-59而不是60.你提供了60.这是解决问题的另一种简单方法。只需使用DateFormat类。

String timeDateStr ="2017-18-08 12:59:30.345";

DateFormat df = new SimpleDateFormat("yyyy-dd-MM hh:mm:ss.SSS", Locale.ENGLISH);

try {

Date d = df.parse(timeDateStr);

System.out.println(d.toInstant().toEpochMilli());

} catch (ParseException e) {

e.printStackTrace();

}

您的代码将因以下3个原因而失败。

您的日期字符串(2017-18-08 12:60:30.345)与您使用的格式化程序不匹配。 它应该是yyyy-MM-dd HH:mm:ss.SSS而不是yyyy-dd-MM hh:mm:ss.SSS

分钟范围是(0-59),60不在此范围内。

即使你已经纠正了基于上述点的代码,它也不会运行ZonedDateTime。 因此,您需要先创建LocalDateTime,然后再将ZoneId传递给它。

代码应如下所示:

String timeDateStr ="2017-18-08 12:59:30.345";

DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss.SSS");

LocalDateTime date = LocalDateTime.parse(timeDateStr, dtf);

ZonedDateTime     zdt  = date.atZone(ZoneId.of("Europe/London"));

System.out.println(zdt.toInstant().toEpochMilli());

只是我在nagendra547的答案中做了一些改变

请访问以下代码: -

String timeDateStr ="2017-18-08 12:59:30.345";

DateFormat df = new SimpleDateFormat("yyyy-dd-mm hh:mm:ss.SSS", Locale.ENGLISH);

try {

Date d = df.parse(timeDateStr);

System.out.println(d.toInstant().toEpochMilli());

} catch (ParseException e) {

e.printStackTrace();

}

java纪元时间_关于java:如何将时间戳字符串转换为纪元时间?相关推荐

  1. 把字符串转换为日期时间

    有一字符串"2013080117041122"需要转换为日期时间. Insus.NET在MSDN找到一个方法,就是DateTime.ParseExact,它是可以把一个字符串转换为 ...

  2. 将字符串转换为日期时间

    我有大量的日期时间列表,例如字符串: Jun 1 2005 1:33PM Aug 28 1999 12:00AM 我将把它们推回到数据库中正确的日期时间字段中,因此我需要将它们魔术化为实际的日期时间对 ...

  3. Python将字符串转换为日期时间

    In this tutorial, we'll see how to convert string to datetime in python. 在本教程中,我们将看到如何在python中将字符串转换 ...

  4. java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间

    使用 Apache Commons Net 进行 FTP 编程的时候,可以使用 FTPClient 类的方法来获取和设置 FTP 服务器上特定文件的修改时间: String getModificati ...

  5. java 函数 微秒_在Java中以微秒为单位解析时间

    我在解析2013-01-09 09:15:03.000000格式的Java时间字符串时遇到问题. 在我的数据中,最后三个数字始终为0(表示输入字符串仅具有毫秒精度),因此我将此格式传递给SimpleD ...

  6. java时间转换为字符串格式错误_字符串转换为日期时间格式及其错误处理(转)

    1. 字符串转换成日期时间格式 //日期时间格式:yyyy-MM-dd hh:mm:ss String time ="1900-02-21 12:23:33"; //将字符串转换为 ...

  7. 我的世界java版怎么弄在线时间_我的世界怎么设置游戏内的时间为清晨

    我的世界怎么设置游戏内的时间为清晨 本篇教程将用图文的形式一步步教会你在我的世界中怎么设置游戏内的时间为清晨. 在我的世界中,你可以使用作弊秘籍(游戏命令)将时间设置为清晨来欣赏美丽的日出. 让我们来 ...

  8. 我的世界java版怎么弄在线时间_我的世界怎么设置游戏内的时间为夜晚

    我的世界怎么设置游戏内的时间为夜晚 本篇教程将用图文的形式一步步教会你在我的世界中怎么设置游戏内的时间为夜晚. 当我的世界游戏中的时间变为白天的时候,你可以使用秘籍(游戏命令)快速将时间切换为夜晚. ...

  9. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

最新文章

  1. 数据恢复工具,每秒钟扫描 1000万文件!
  2. 2017.3.9 对象 函数
  3. Leetcode 120. 三角形最小路径和 (每日一题 20210927)
  4. Thymeleaaf中设置属性值实现动态控制select是否可选
  5. C#开发和使用中的23个技巧
  6. leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  7. 作者:贵芳(1991-),女,合肥工业大学计算机与信息学院硕士生
  8. 快捷配置Hibernate实现对数据库的配置(构建通道)
  9. oracle 数据库dg搭建规范1
  10. 情侣在公交车上接吻遭乘客指责
  11. 贵州省NPP净初级生产力数据/NDVI数据
  12. Mxne入门--第2篇
  13. 支持向量回归机(SVR)代码
  14. C++模拟鼠标键盘操作(转)
  15. 做好里程碑就是项目成功了一半
  16. Tippy.js - 免费开源且高度可定制的气泡提示独立组件
  17. 【C语言】之实现三角形类型判断
  18. 如何拼局域网所有ip_在windows命令行批量ping局域网内IP
  19. 提问的艺术,原文链接
  20. JAVA SE程序设计及实践

热门文章

  1. 推荐几款好用的截图软件
  2. 谁说Power不能云化?招商银行实力回应
  3. HTML5 移动应用开发的生态环境简介
  4. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)理论考试
  5. 接口基本概念(未完待续)
  6. 三星可能已后悔离开中国制造,它在越南的工厂无奈大幅减产
  7. 由浅入深:Python 中如何实现自动导入缺失的库?
  8. 威马汽车任命前高盛高管为首席战略官 新一轮融资将超30亿
  9. 【自动驾驶】1.V2X、OBU、RSU、V2V之间的协作关系
  10. 计算机系统基础第四篇-6 elf文件的链接