如何将时间戳字符串转换为纪元时间?

2023-12-15

我有格式的时间戳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:无法解析文本“2017-18-08 11:45:30.345”:无法从 TemporalAccessor 获取 ZonedDateTime

我也尝试了不同的格式,但仍然出现错误。


Note: originally the question had the input 2017-18-08 12:60:30.345 (with 60 in the minutes field), then it was edited (the time changed from 12:60 to 11:45), but I decided to keep this answer discussing about the original input (12:60), as it also works for the edited version (11:45).


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

输入中还有其他详细信息:

  • 分钟值为60,这是不被接受的:有效值是从0到59(实际上有一种方法可以接受这个,请参阅“宽松解析” below)
  • the hh is the 上午-下午的时钟时间 field,因此还需要完全解析 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

这相当于2017-18-08 12:59:30.345 in UTC.

如果您想要另一个时区的日期,您可以使用ZoneId class:

// 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, like America/Sao_Paulo or Europe/Berlin)。 避免使用 3 个字母的缩写(例如CST or PST) 因为他们是模棱两可且不标准.

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

您还可以使用系统默认时区 with ZoneId.systemDefault(),但是即使在运行时,这也可以在不通知的情况下进行更改,因此最好显式使用特定的更改。


还有一个选项可以转换LocalDateTime to an offset (like -05:00 or +03:00):

// get the LocalDateTime in +03:00 offset
System.out.println(dt.toInstant(ZoneOffset.ofHours(3)).toEpochMilli());

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

1503050370345


宽松的解析

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

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 或固定偏移量(使用ZoneOffsetclass),您可以忽略此部分。

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

In São Paulo, DST starts at October 15th 2017: at midnight, clocks shift 1 hour forward from midnight to 1 AM. So all local times between 00:00 and 00:59 don't exist in this timezone. If I create a local date in this interval, it's adjusted to the next valid moment:

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]

When DST ends: in February 18th 2018 at midnight, clocks shift back 1 hour, from midnight to 23 PM of 17th. So all local times from 23:00 to 23:59 exist twice (in DST and in non-DST), and you must decide which one you want:

// 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 and -03:00)。这会影响 epochMilli 的值。

您必须检查您选择的时区中 DST 的开始和结束时间,并检查相应的调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将时间戳字符串转换为纪元时间? 的相关文章

  • 将特定项目移至列表末尾

    我有一个ArrayList in Java deleteItem createitem exportitem deleteItems createItems 我想移动包含的所有字符串delete到列表的末尾 所以我会得到下一个 create
  • setSize() 不起作用?

    我有一个程序 需要两个按钮 一个是常规按钮 另一个具有根据鼠标悬停而变化的图片 目前 由于图片很大 JButton自定义也很大 我可以更改自定义的大小并保持图像 和翻转图像 成比例吗 我尝试过 setSize 但它没有任何作用 对于任何反馈
  • Eclipse 调试“未找到源”

    我刚刚开始使用 Eclipse 所以慢慢来吧 但是 当尝试调试 JUnit 测试用例时 我会收到一个对话框 指出当我在测试方法中的代码中找到此行时 未找到源代码 Assert assertEquals 1 contents size 我知道
  • 无法解析 Java 中的方法

    我有一个Question具有 4 个的对象Answer里面的物体 在 Question java 我有一个方法是 public Answer getA return a 在另一种方法中我有 if questions get randomNu
  • 在这种情况下,我如何处理 Function 和省略号/可变参数?

    我的项目之一是抛出 lambda 表达式 https github com fge throwing lambdas 我的目标是简化潜在的使用 FunctionalInterfaces in Streams 其在流中使用的唯一 缺陷 是它们
  • 给定一个 IP 地址列表,如何找到最小值、最大值?

    在Java中 我有一个ip地址的数组列表 我如何找到最小值和最大值 我已经使用了 Collection min 但在以下情况下它不起作用 192 168 0 1 lt min 192 168 0 250 192 168 0 9 lt max
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 如何将 java ArrayList 转换为等效的 double[] [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Java 中从 List 转换为 double https stackoverflow com questions 6018267 how to cast from listdouble to
  • 将 Flash 文件上传与 JSF 集成

    我看到我们可以通过flash文件上传来上传多个文件 喜欢SWF上传 http code google com p swfupload or YUI上传器 http yuilibrary com yui docs uploader 是否可以将
  • 动态更新 LookAndFeel 值

    我希望能够动态更新 Swing GUI 的 LookAndFeel 属性 在本例中 我有一个简单的 Swing Awt 游戏 运行最初为 Nimbus 的游戏LookAndFeel 在启动后的各个时刻 我只想更改 比方说 一个细节 应用程序
  • 更改 WireMock __files 目录

    来自docs http wiremock org docs stubbing 要从文件中读取正文内容 请将文件放在 files 下 目录 默认情况下 这应该位于 src test resources 下 从 JUnit 规则运行时 当独立运
  • 如何在 jax-ws 客户端中隐藏(可能)由 jax-ws 库引起的警告

    我正在使用 netbeans 在我的应用程序中生成 Web 服务客户端 我的程序使用 jax ws 库来设置调用 Web 服务的超时 出现问题是因为每当我启动这个程序时它都会生成很多这样的警告消息 2010 年 12 月 13 日下午 4
  • 如何在调整大小时更改 JLabel 字体大小以填充 JPanel 可用空间?

    这里有一个类似的问题 如何更改 JLabel 的字体大小以获取最大大小 https stackoverflow com questions 2715118 how to change the size of the font of a jl
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • 计算事件之间的天数 - Android

    我一直在研究 Android API 并一直在寻找一种方法来计算当前日期和未来日期之间的天数 我对 android 还很陌生 而且我已经有几年没有做过 java 了 计算这个最简单的方法是什么 Thanks 最简单的方法是使用乔达时间 ht
  • 为什么 writeObject 抛出 java.io.NotSerializedException 以及如何修复它?

    我有这个异常 我不明白为什么会抛出它 或者我应该如何处理它 try os writeObject element catch IOException e e printStackTrace Where element is a Transf
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom
  • 根据另一个列表的顺序对列表进行排序[重复]

    这个问题在这里已经有答案了 我需要对列表进行排序Person对象 List
  • Spring Boot 和安全性以及自定义 AngularJS 登录页面

    我正在为 Spring Security 实现一个自定义 AngularJS 登录页面 但遇到身份验证问题 遵循本教程 示例 以及他们的示例在本地运行良好 https github com dsyer spring security ang
  • Spring Data JPA 存储库,具有规范、分页和标准 fetch-join

    我正在使用具有规范和分页功能的 Spring Data JPA 存储库实现实体列表的搜索 过滤服务 我正在尝试减少查询数量 n 1 问题 并使用条件获取机制获取嵌套数据 我有两个实体类 Entity Table name delegatio

随机推荐

  • 使用 Apache poi 从 docx 获取文本样式

    我正在尝试从 MS docx 文件中获取样式信息 使用添加的样式 如粗体 斜体 编写文件内容没有问题 字体大小等 但读取文件内容并获取样式信息不太清楚 我尝试过使用 XWPFDocument 这个 API 似乎没有读取样式的能力 我现在正在
  • 如何在使用 swift 继续访问视图控制器之前实例化并加载视图控制器

    当我从 viewController A 转到 viewController B 时 我遇到了一个问题 在继续执行之前大约有 5 秒的延迟 我相信这是由于我在 viewDidLoad 中加载的视图数量所致 我有一个 xib 文件 其中包含代
  • 我可以在电子邮件中嵌入 Twitter 源吗?

    我即将向我的客户发送一封电子邮件活动 电子邮件将以 HTML 格式发送 我想在电子邮件中嵌入 Twitter 提要 类似于您在博客和网站中看到的嵌入 Twitter 小部件 当我复制并粘贴通过 Twitter 网站生成的代码时 我的电子邮件
  • 如何使用单声道解决 OSX 上的 SecureChannelFailure

    我正在尝试访问https geocoder cit api here com在单声道上使用 NET F 我正在使用Http帮手来自FSharp Data使用以下代码 let baseUrl https geocoder cit api he
  • 每个奇特的指针都应该是迭代器吗?

    我正在为 C 开发基于段的内存分配器 在这个分配器中 当你释放一块内存时 你必须知道是哪块内存segment它来自 因此 我将指向该段的指针存储为花哨的成员pointer从分配器返回allocate功能 只是为了显示我正在谈论的界面 这是f
  • Android - GCM 服务器密钥不适用于 Urban Airship

    我正在尝试将 Urban Airship 推送通知服务集成到我的 android 项目中 我在 google 开发者控制台中创建了一个新项目 并创建了一个 GCM 服务器密钥 我也在 Urban Airship 配置中添加了该 GCM 密钥
  • 使用实体框架我想仅包含第一个子对象而不是子对象的子对象(子的子对象)

    使用实体框架我想仅包含第一级子对象而不是子对象的子对象 我有这两门课 public class BusinessesTBL public string ID get set public string FirstName get set p
  • 从基类到所有后代遍历类层次结构

    在我正在编写的 iOS 应用程序中 我想遍历类层次结构以列出所有子类的清单 我的意图是使用每个子类类型作为键 viaNSStringForClass 在字典里 我的动机是能够自动发现基类的所有变体 以便我可以调用与该类关联的方法 出于分工的
  • 如何使用下拉列表而不是所有者绘制样式更改组合框控件的外观高度?

    背景 在某个对话框中 有多个连续的控件 我希望它们都具有相同的表观高度 但是 对于具有 CBS DROPDOWNLIST 样式且没有 CBS OWNERDRAW 的组合框 我在更改表观高度时遇到了麻烦 问题 如何更改此类 DROPDOWNL
  • Slim 4 将所有路由放入控制器中,无需 $app

    我需要将所有注册的路由放入控制器中 在 slim 3 中 可以使用以下方式获得路由器 router container gt get router routes router gt getRoutes 使用 app 很容易 routes a
  • 可以在 C# 中使用带有非默认构造函数的单例吗?

    我正在为我的一个项目实施一个通知框架 因为我希望它非常通用 所以用户可以使用多个传输层 这样他就不需要真正关心使用一种交付方法 比如说 WCF 或另一种交付方法 例如 ActiveMQ 用户访问的接口当然与交付方法 WCF 或 Active
  • Doc 文件无法从 asp.net 中的 UserControl 下载

    我有用户控件 其中包含带有候选数据的网格 有一个带有模板字段链接按钮的列候选名称 我附加了一个 rowcommand 事件 我正在该事件上下载一个 word 文件 我有下载文档文件代码 可以从简单的网页下载我的文档文件 但此代码不适用于用户
  • 在最后一帧停止 CSS3 动画

    我有一个 4 部分的 CSS3 动画 点击时播放 但动画的最后一部分是为了将其从屏幕上移开 然而 一旦播放完毕 它总是会回到原来的状态 谁知道我怎样才能将其停止在最后一个 CSS 框架上 100 或者如何在播放后删除它所在的整个 div k
  • 在命令行上使用 OSX Leaks 进行 C 程序?

    谁能给我任何运行 OSX 的简单语法leaks用于检测已编译的 C 程序中的内存泄漏的工具 我使用的是 10 8 所以我遇到了严重的兼容性问题valgrind 我读过的关于 XCode 的泄漏 工具的大部分内容都涉及 XCode 环境 这不
  • Typescript 中的方括号与表达式后的关系

    Typescript 中以下两个方括号符号有区别吗 尝试了几个场景 看起来它们是等效的 谢谢你 interface test a string b string const x test a aaaa b bbbb const y test
  • Vincent 图没有显示,没有收到错误

    由于某种原因 当我尝试与文森特一起绘制某些内容时 我得到以下内容
  • 将复选框状态传递给 PHP

  • Java将文件附加到zip中[重复]

    这个问题在这里已经有答案了 可能的重复 使用 Java 将文件附加到 zip 文件 我有一个 zip 文件 其中包含一些文件夹 但重要的一个是 dir 其中有另一个名为 文件夹 的文件夹 该文件夹包含许多我需要能够更新的文件 我现在在 zi
  • 画布上的绘画随着时间的流逝而褪色|奇怪的 alpha 分层行为

    我正在一块未被清除的画布上绘画 并使其随着时间的推移画布逐渐褪色为纯色 或者逐渐褪色以显示后面的图层 我的第一直觉是简单地在每帧中用低 Alpha 值填充绘图上的一个矩形 以便填充颜色逐渐累积 使绘图逐渐淡出 但我发现了一些奇怪的行为 至少
  • 如何将时间戳字符串转换为纪元时间?

    我有格式的时间戳2017 18 08 11 45 30 345 我想将其转换为纪元时间 所以我正在执行以下操作 String timeDateStr 2017 18 08 11 45 30 345 DateTimeFormatter dtf