当前位置: 首页 > 知识库问答 >
问题:

在Scala中,GMT和BST的不同ZonedDateTime在toInstant转换后变成相同的Instant

缪晋
2023-03-14

总结一下我的问题,我有两个不同的ZonedDateTime对象,它们具有GMT和BST,但本地时间相同。它们在toInstant转换后成为相同的Instant值。我希望在转换后,它们应该是不同的值,因为虽然它们都是“2021 2月23日星期二18:00:46”,但字符串代表不同时区的时间。我不确定这是图书馆本身的问题,还是我做错了什么。

我从这段Scala代码生成了2个不同的ZonedDateTime:

import ...
import java.util.{Set => JavaSet}
val string2 = "Tue Feb 23 18:00:46 BST 2021" 
val string1 = "Tue Feb 23 18:00:46 GMT 2021" 
val timestampFormat: DateTimeFormatter = new DateTimeFormatterBuilder()
    .appendOptional(DateTimeFormatter.ISO_DATE_TIME)
    .appendOptional(DateTimeFormatter.ISO_INSTANT)
    .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
    .appendOptional(DateTimeFormatter.ISO_ZONED_DATE_TIME)
    .appendOptional(DateTimeFormatter.RFC_1123_DATE_TIME)
    .appendPattern("EEE MMM ppd HH:mm:ss ")
    .appendZoneText(TextStyle.SHORT, JavaSet.of(ZoneId.of("Europe/London")))
    .appendPattern(" yyyy")
    .toFormatter(Locale.US)

val parsedZdt2: ZonedDateTime = ZonedDateTime.parse(string2, timestampFormat)
val parsedZdt1: ZonedDateTime = ZonedDateTime.parse(string1, timestampFormat)
println(parsedZdt1 == parsedZdt2)
println("parsedZdt1.toString: " + parsedZdt1.toString)
println("parsedZdt2.toString: " + parsedZdt2.toString)

打印出来:

false
parsedZdt1.toString: 2021-02-23T18:00:46Z[GMT]
parsedZdt2.toString: 2021-02-23T18:00:46Z[Europe/London]

但是,当我将它们转换为即时时:

println(parsedZdt1.toInstant == parsedZdt2.toInstant)
println("parsedZdt1.toInstant.toString: " + parsedZdt1.toInstant.toString)
println("parsedZdt2.toInstant.toString: " + parsedZdt2.toInstant.toString)

我把这个打印出来了:

true
parsedZdt1.toInstant.toString: 2021-02-23T18:00:46Z
parsedZdt2.toInstant.toString: 2021-02-23T18:00:46Z

我的问题是

  1. 为什么两个值在toInstant转换后变得相同
  2. 这两个值在toInstant之前是否表示相同的时间,即parsedZdt1和parsedZdt2表示相同的时刻

谢谢你!

暂时还没有答案

 类似资料:
  • 我正在微服务中做一些更改,它有一个像以下这样的对象: } 我将从Json中获取我将要使用的信息。Json有一个名为的键,我想在两个不同的变量中使用这个速率,一个int-rate和一个Float-ratePPR。这里的问题是,我知道在同一个对象中不能有来自同一个Json的两个变量,但我有义务这样做,因为我不能触摸变量,所以我创建了变量,以便在需要时使用。 当我进行测试时,会出现以下错误: 属性“ra

  • 问题内容: 下面的代码旨在生成间隔为[1,100]的五个伪随机数的列表。我为with设置了种子,它以unix时间返回系统时间。当我使用Microsoft Visual Studio 2013在Windows 7上编译并运行该程序时,它会按预期运行(请参阅下文)。但是,当我在Arch Linux中使用g ++编译器执行此操作时,它的行为就很奇怪。 在Linux中,每次将生成5个数字。每次执行后4个数

  • 问题内容: 解决的问题 外部设备正在计算并发送非标准的2小时轮班时间戳,这使我非常困惑,并启动了该线程。时区 不会影响自己的时间戳 ,时区仅在以人类可读形式进行转换时适用。 我在UTC时区有时间戳记(距离unix纪元的秒数​​),没有DST(夏令时)。 我想要使​​用DST的“欧洲/布拉格”时区中的时间戳(距Unix纪元的秒数​​)。 我曾经以为unix时间戳不受时区限制,时区仅影响将时间戳转换为

  • ...NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:映射到HTTP路径的处理程序方法不明确...

  • 我正在使用tomcat、jsp和MSSQL2008,希望获得一些汇总数据,如每日、每周、每月和每年。从这里,我搜索了如何对来自MSSQL的这些摘要数据使用datapart()函数。在JSP中,我使用 在MSMS中,查询指令进行测试。 我在JSP程序中遇到了两个问题,但在MS SQL Server Management Studio中使用相同的查询可以很好地工作。 null 我的问题是:

  • 我在类SpawnManager中声明了一个私有int tree_count。void Start()和void Update()按照预期使用了该变量,但另一个方法public void tree_destroy似乎使用了不同的tree_count。 这是我的代码。