- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个简单的Web界面,其日期和时间的格式为“2009/10/09 11:00”或“yyyy/MM/dd HH:mm”。时间(从用户的角度来看)为东部时间。
我希望能够使用此字符串,将其转换为UTC时间戳,因此我可以采用此时间戳,并根据指定的时间查询我们的NoSQL数据库。
我的代码如下:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(startSearchTime, formatter);
System.out.println(dateTime);
LocalDateTime utcTime = dateTime.plusHours(4);
Instant instant = Instant.parse(utcTime.toString());
System.out.println(instant.toEpochMilli());
最佳答案
Yasmani Llanes的answer基本上是正确的。我会讲解。LocalDateTime
!= UTC时刻
LocalDateTime
不是真实的日期时间,它与时间线无关。除非您将其调整到一个时区以确定时间线上的某个点(片刻),否则它没有真正的意义。您的代码LocalDateTime utcTime
以及您选择的变量名,表明您已将一个“本地”日期时间与一个UTC时刻混为一谈。它不是。一个是模糊的想法,另一个是真实的。 (嗯,在牛顿意义上是真实的,而在爱因斯坦相对论意义上则不是很多;-))
因此, LocalDateTime::toString
的输出不是Instant.parse
方法所期望的完整格式的字符串。具体来说,它没有与offset-from-UTC或time zone有关的数据。上一段说明了这是一个功能而不是bug 的原因。
您想要的是一个ZonedDateTime
,它基本上是一个Instant
(UTC时间轴上的某个时刻)加上一个ZoneId
(时区)。
ZonedDateTime
=Instant
+ZoneId
ZoneId
= offset-from-UTC + adjustment-rules
LocalDateTime
进行检查是正确的,这会使它变得有些困惑。从逻辑上讲,我们应该能够直接从输入String解析为
ZonedDateTime
。但是存在一个问题,即由于调整规则,没有任何时区信息的输入字符串可能不适用于特定的时区。例如,在 Spring ,当我们采用夏时制“提前”时,在美国,凌晨2点向前跳一个小时,则当天没有“02:38”或“20:54” 。时钟从01:59.59.x跳到03:00:00.0。
LocalDateTime
对象传递给
ZonedDateTime
来处理此调整,而不是让
ZonedDateTime
在解析时直接处理它。分两个步骤:(1)将字符串解析为
LocalDateTime
,(2)将
LocalDateTime
对象和
ZoneId
对象提供给
ZonedDateTime
。要正确处理当天输入为“20:54”的字符串,我们需要将其解析为
LocalDateTime
,然后要求
ZonedDateTime
使用指定的时区进行调整(结果是“03:54”,我认为-阅读类文档,了解调整行为中使用的详细信息和逻辑)。
ZonedDateTime
。使用您创建的
LocalDateTime
对象,我们需要为
ZoneId
指定
ZonedDateTime
对象,以用于完成到
ZonedDateTime
的转换。
America/New_York
(请注意下划线)或
America/Montreal
或此类区域。我会随便去纽约。
2015-10-15T13:21:09Z
。这些格式包括自UTC的偏移量,例如前一句中显示的
Z
(祖鲁语,UTC)。 java.time框架通过在括号中添加时区名称来明智地扩展了ISO 8601格式。传递没有偏移量或时区信息的日期时间字符串会带来麻烦。
LocalDateTime
对象。
// Parse input string into a LocalDateTime object.
String input = "2009/10/09 11:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyy/MM/dd HH:mm" );
LocalDateTime localDateTime = LocalDateTime.parse ( input , formatter );
LocalDateTime
转换为时间线上的实际时刻。我们假设输入字符串表示使用纽约时区的
wall-clock time中的
Poughkeepsie。因此,我们获得了纽约时区的
ZoneId
对象。
// Specify the time zone we expect is implied for this input string.
ZoneId zoneId = ZoneId.of ( "America/New_York" );
ZonedDateTime zdtNewYork = ZonedDateTime.of ( localDateTime , zoneId );
+05:30
)。
// For fun, adjust into India time, five and a half hours ahead of UTC.
ZonedDateTime zdtKolkata = zdtNewYork.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
ZonedDateTime
,所以该类处理诸如
Daylight Saving Time之类的异常所需的调整。
// Get a moment four hours later.
ZonedDateTime later = zdtNewYork.plusHours ( 4 ); // DST and other anomalies handled by ZDT when adding hours.
ZoneOffset
( ZoneId
的子类)中定义的方便的常量。 Instant
中提取ZonedDateTime
。根据定义,Instant
始终以UTC表示。 toString
实现中如何使用不同的格式。
// To get the same moment in UTC time zone, either adjust time zone or extract Instant.
ZonedDateTime zdtUtc = zdtNewYork.withZoneSameInstant ( ZoneOffset.UTC );
Instant instant = zdtNewYork.toInstant ();
System.out.println ( "input: " + input );
System.out.println ( "localDateTime: " + localDateTime );
System.out.println ( "zdtNewYork: " + zdtNewYork );
System.out.println ( "zdtKolkata: " + zdtKolkata );
System.out.println ( "zdtUtc: " + zdtUtc );
System.out.println ( "instant: " + instant );
System.out.println ( "later: " + later );
input: 2009/10/09 11:00
localDateTime: 2009-10-09T11:00
zdtNewYork: 2009-10-09T11:00-04:00[America/New_York]
zdtKolkata: 2009-10-09T20:30+05:30[Asia/Kolkata]
zdtUtc: 2009-10-09T15:00Z
instant: 2009-10-09T15:00:00Z
later: 2009-10-09T15:00-04:00[America/New_York]
java.sql.Timestamp
对象。为您提供的便捷转换方法,例如
java.sql.Timestamp.from( Instant instant )
。
java.sql.Timestamp ts = java.sql.Timestamp.from( zdtNewYork.toInstant () );
关于java - 在东部时间中获取日期和时间输入,并在Java中转换为UTC时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179166/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!