我正在使用以下 ISO8601 格式:
YYYY-MM-DDThh:mm:ssZ
Run Code Online (Sandbox Code Playgroud)
我曾经OffsetDateTime.parse()解析过这种格式。我能够通过在此处传递t(而不是T) 和z(而不是Z) 来解析日期时间。
那么谁能告诉它在ISO8601中是否允许,还是仅在解析逻辑中被忽略?
我需要 java 类中 2022-10-03T19:45:47.844Z 格式的当前系统日期和时间。
我尝试使用 zoneddatetime 和简单日期格式,但无法从在线获取写入语法或代码。我是 Java 初学者,非常感谢任何帮助。谢谢。
java iso8601 datetime-format simpledateformat 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 格式的偏移量?
从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”。
我有一个 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”日期返回不同的偏移量。
我正在使用 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 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)