标签: offsetdatetime

ISO8601 格式中的时区指示符“T”和“Z”是否区分大小写?

我正在使用以下 ISO8601 格式:

YYYY-MM-DDThh:mm:ssZ
Run Code Online (Sandbox Code Playgroud)

我曾经OffsetDateTime.parse()解析过这种格式。我能够通过在此处传递t(而不是T) 和z(而不是Z) 来解析日期时间。

那么谁能告诉它在ISO8601中是否允许,还是仅在解析逻辑中被忽略?

java iso8601 java-time datetimeformatter offsetdatetime

7
推荐指数
1
解决办法
1330
查看次数

如何在Java中获取格式为2022-10-03T19:45:47.844Z的日期和时间

我需要 java 类中 2022-10-03T19:45:47.844Z 格式的当前系统日期和时间。

我尝试使用 zoneddatetime 和简单日期格式,但无法从在线获取写入语法或代码。我是 Java 初学者,非常感谢任何帮助。谢谢。

java iso8601 datetime-format simpledateformat offsetdatetime

5
推荐指数
1
解决办法
4078
查看次数

如何使用 MySQL Connector/J 直接检索 UTC OffsetDateTime?

我更喜欢所有时间都采用 UTC,除了显示的时间。在最后一刻,它们可以转换为当地时间仅供显示。

我之前总是将 UNIX 时间戳(自纪元以来的秒数)存储在 MySQL 中的整数字段中。我正在使用别人的数据库模式,我无法更改该模式,它使用DATETIME存储原始时间甚至没有偏移量的数据库模式。

如何使用 UTC 格式的数据库检索和发送时间对象,以便数据库完全不进行任何转换?


虽然是为 PostgreSQL 编写的,但我尝试遵循 Basil Bourque 对以下问题的出色回答。我Instant在任何地方都使用它,除了他展示的我OffsetDateTime在与 JDBC 交互时使用 an ,因为它是 JDBC 4.2 保证支持的唯一现代时刻类。

我正在使用 MySQL Connector/J 驱动程序版本 8.0.27,并且我正在使用&preserveInstants=false&connectionTimeZone=UTC.

让我们看一下DATETIME数据库中存储为“2022-01-14 11:00:00”的 a,它被理解为 UTC。

resultSet.getString(columnName); // "2022-01-14 11:00:00"
resultSet.getObject(columnName, OffsetDateTime.class).toString() // "2022-01-14T11:00-04:00"
resultSet.getObject(columnName, OffsetDateTime.class).toInstant().toString() // "2022-01-14T15:00:00Z"
Run Code Online (Sandbox Code Playgroud)

当它创建 时OffsetDateTime,它会分配系统或服务器(同一台机器)偏移量“-04:00”并搞乱一切。我认为我的连接选项&preserveInstants=false&connectionTimeZone=UTC应该可以阻止这种情况。

我知道我可以立即使用 来将偏移量设置为“+00:00” .withOffsetSameLocal(ZoneOffset.UTC).toInstant(),但是如何避免这样做并让它直接创建OffsetDateTimeUTC 格式的偏移量?

java mysql datetime jdbc offsetdatetime

3
推荐指数
1
解决办法
1183
查看次数

Kotlin DateTimeParseException

https://api.spacexdata.com/v3/launches获取日期 该日期的格式为:2006-03-25T10:30:00+12:00。我想将其转换为“dd,mm,yyyy”,但总是收到错误:“java.time.format.DateTimeParseException:文本'2006-03-25T10:30:00 + 12:00'无法解析,未解析的文本发现于索引 10"

我的代码:

val formatter = DateTimeFormatter.ofPattern("dd, mm, yyyy", Locale.US)
val myDate = LocalDate.parse(launchDate, formatter)

var launchDateConverted: String=  myDate.toString()
Run Code Online (Sandbox Code Playgroud)

我在字符串中获取数据,然后将其转换为日期进行格式化,然后将日期转换回字符串以在 UI 上显示。我使用了不同的方法,但找不到正确的方法。我当前的语言环境是“RU”。

datetime kotlin java-time datetimeformatter offsetdatetime

2
推荐指数
1
解决办法
2813
查看次数

Java OffsetDateTime 返回错误的偏移量

我有一个 Java 时间戳值,如:1799-12-31 19:03:58.0 当我尝试使用代码将其转换为 OffsetDateTime 时:

timestamp.toLocalDateTime().atZone(ZoneId.systemDefault()).toOffsetDateTime();
Run Code Online (Sandbox Code Playgroud)

它给了我输出:

1799-12-31T19:03:58+05:53:28
Run Code Online (Sandbox Code Playgroud)

在前端(Angular 的日期管道)没有被解析。但相同的代码返回时间戳的不同偏移量:2019-08-24 10:15:22.0为:

2019-08-24T10:15:22+05:30
Run Code Online (Sandbox Code Playgroud)

这是有效的并且成功地被 Angular 的日期管道解析。

我不明白为什么它为“1799-12-31 19:03:58.0”日期返回不同的偏移量。

java offsetdatetime

2
推荐指数
2
解决办法
102
查看次数

当时间需要与本地时间保持相同而不管 DST 时,使用 Java 中的 OffsetDateTime 处理夏令时

我正在使用 Spring Boot (Java 8) 开发一个餐厅应用程序的后端,该应用程序公开了一些 REST API。与日期和时间相关的所有内容都是通过OffsetDateTime对象并通过我使用的应用程序处理的,默认情况下"Europe/Rome",. 这些对象也保存在数据库中。一切都工作正常,除了……夏令时开始了,现在餐厅的所有营业时间都缩短了一小时。

显然会发生这种情况,因为 DST 之前的偏移量"Europe/Rome"+01:00,而 DST 后的偏移量是+02:00。因此,举个例子,餐厅的营业时间(在 DST 之前保存在 DB 内)是08:30:00+01:00,但它变成09:30:00+02:00(因为它会自动使用系统的默认区域进行转换)。我需要餐厅的营业时间与当地时间保持一致,无论夏令时如何。

我该如何处理这种情况并向用户提供一致的数据?

java spring dst spring-boot offsetdatetime

1
推荐指数
1
解决办法
3630
查看次数

如何在java 13或更高版本中格式化OffsetDateTime?

在 Java 11 中,时钟系统使用毫秒精度,但显然在 Java 13 及更高版本中,它使用微秒精度,这导致我的测试失败。例如,OffsetDateTime.now()当我从数据库“2021-12-10T10:58:05.309595+01:00”读取此日期时,给我这个日期“2021-12-10T10:58:05.309594500+01:00”。我正在寻找一种方法,可以以它们应该相等的方式格式化第一个日期。我确实希望将其设置为 OffsetDateTime 类型而不是字符串。

更新:我意识到这个问题是在我将java版本从11升级到17时出现的,而不是在本地,当gitlab运行测试时我遇到了这个问题。

这是测试:

@Test
    fun `can store, find and delete a failed-message`() {
        // given: a failed-message
        val failedMessage = FailedMessage(
            failedMessageId = FailedMessageId("the-subcription", "the-message-id"),
            messageAttributes = mapOf("one" to "een", "two" to "twee"),
            messagePayload = "message-payload",
            exception = "exception",
            dateTime = OffsetDateTime.now(),
            stackTrace = "stackey tracey"
        )
       
        failedMessageRepository.store(failedMessage)
      
        assertEquals(failedMessage, failedMessageRepository.find(failedMessage.failedMessageId))
}
Run Code Online (Sandbox Code Playgroud)

由于日期时间不相等,该测试失败。这是日志:

<FailedMessage(failedMessageId=the-subcription-the-message-id, messageAttributes={one=een, two=twee}, messagePayload=message-payload, exception=exception, dateTime=2021-12-10T10:58:05.309594500+01:00, stackTrace=stackey tracey)>
 but was: 
<FailedMessage(failedMessageId=the-subcription-the-message-id, messageAttributes={one=een, two=twee}, messagePayload=message-payload, exception=exception, dateTime=2021-12-10T10:58:05.309595+01:00, stackTrace=stackey tracey)> …
Run Code Online (Sandbox Code Playgroud)

java datetime java-11 offsetdatetime java-17

1
推荐指数
1
解决办法
4348
查看次数