- 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/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!