使用<code>java。时间,我试图将时间格式化为以下“2018-03-15T23:47:15 01:00”。使用此格式化程序,我接近Scala中的结果。
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ")
ZonedDateTime.now() // 2018-03-14T19:25:23.397+01:00
ZonedDateTime.now().format(formatter) // => 2018-03-14 19:25:23+0100
但是我不能在一天和小时之间插入额外的字符“T”。
顺便说一句,这个“T”是什么意思?
如何格式化为“2018-03-15T23:47:15 01:00”?
笔记:
如果您想知道为什么LocalDateTime
不能格式化格式化,在Java8中使用时区格式化LocalDateTime
正如您的问题已经表明的那样,您可能只需要依靠< code > zoned datetime . tostring()来获得类似于< code > 2018-03-14t 19:25:23.397 01:00 的字符串。顺便说一下,字符串是ISO 8601格式,国际标准。可能只需要两个小的修改:
myZonedDateTime.truncatedTo(ChronoUnit.SECONDS)
来摆脱它。ZonedDateTime.toString()
通常会附加区域名称,例如2018-03-14T19:25:23 01:00[Europe/Paris]
,这不是ISO 8601标准的一部分。为了避免这种情况,请在使用其toString
方法之前转换为OffsetDateTime
:myZonedDateTime.toOffsetDateTime(). toString()
(或myZonedDateTime.truncatedTo(ChronoUnit.SECONDS). toOffsetDateTime(). toString()
)。当您需要时,通过格式模式字符串构建自己的格式化程序是非常灵活的。然而,我们通常可以使用更少的方法(然后为了代码的可维护性,应该这样做):< code>toString方法或内置格式化程序,包括ISO方法和本地化方法,我们可以从< code > datetime formatter . oflocalized pattern()中获得这些方法和格式化程序。
顺便说一句,这个“T”是什么意思?
T
是ISO 8601格式的一部分。它将日期部分与一天中的时间部分分开。您可能会认为它是时间的T,因为它表示时间部分的开始。如果只有日期(2018-04-25
)或只有一天中的时间(21:45:00
),则不使用T
,但当我们两者都有时,需要T
。您可能认为格式可能是在没有T
的情况下指定的,您可能是对的。但是,当涉及到周期/持续时间的格式时,它是必不可少的,并且在没有天数时也需要:P3M
表示3个月的周期,而PT3M
表示3分钟。
链接:在有关ISO 8601的维基百科文章中阅读更多内容。
将ZonedDateTime
转换为OffsetDateTime
-如其他答案中建议的那样-可以工作,但如果您想使用DateTimeForcat
,有一个内置的常量可以完成这项工作:
ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
但是注意所有方法之间的一些差异是很重要的。假设< code>ZonedDateTime包含相当于< code > 2018-03-15t 23:47 01:00 的日期/时间(秒和毫秒为零)。
答案中涵盖的所有方法都将为您提供不同的结果。
toString()
在秒和毫秒为零时忽略它们。所以这个代码:
ZonedDateTime zdt = // 2018-03-15T23:47+01:00
zdt.toOffsetDateTime().toString()
指纹:
2018-03-15T23:47 01:00
只有小时和分钟,因为秒和毫秒为零
如果它是零,内置格式化程序将只忽略毫秒,但是不管值是多少,它都将打印秒。所以这个:
zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
指纹:
2018-03-15T23:47:00 01:00
秒打印,即使为零;毫秒省略
使用显式模式的格式化程序将始终打印所有指定的字段,而不管它们的值如何。所以这:
zdt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx"))
指纹:
2018-03-15T23:47:00.000 01:00
秒和毫秒被打印,无论它们的值如何
您还会发现值之间的差异,例如2018-03-15T23:47:10.120 01:00
(注意120
毫秒)。toString()
和ofPattern
将为您提供:
2018-03-15T23:47:10.120 01:00
而内置的< code>DateTimeFormatter。ISO_OFFSET_DATE_TIME将只打印前两位数字:
2018-03-15T23:47:10.12 01:00
在选择使用哪种方法时,请注意这些细节。
试试这个
val ZONED_DATE_TIME_ISO8601_FORMATTER3 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx")
ZonedDateTime.now().format(ZONED_DATE_TIME_ISO8601_FORMATTER3)
// 2018-03-14T19:35:54.321+01:00
看到这里了吗
偏移量 X 和 x:这会根据图案字母的数量设置偏移量的格式。一个字母只输出小时,例如 '01',除非分钟不为零,在这种情况下,分钟也是输出的,例如 '0130'。两个字母输出小时和分钟,不带冒号,例如'0130'。三个字母输出小时和分钟,并带有冒号,例如“01:30”。四个字母输出小时和分钟以及可选的秒,不带冒号,例如“013015”。五个字母输出小时和分钟以及可选的秒,并带有冒号,例如'01:30:15'。六个或更多字母抛出非法争议异常。当要输出的偏移量为零时,图案字母“X”(大写)将输出“Z”,而图案字母“x”(小写)将输出“00”,“0000”或“00:00”。
问题内容: 由于某种原因,我将时间格式转换为:。我想将其转换回原来的第一个(相同)格式。怎么可能 我的尝试: 现在,分钟呢? 考虑价值可能就像 我认为您了解了一样。 顺便说一下,如何转换 问题答案: 如果要获取时间格式:
问题内容: 我正在使用Java的SimpleDateFormat将毫秒数转换为一种不错的“ hh:mm:ss:SSS”格式的秒表。问题是小时数字段中总是有一些随机数。这是我正在使用的代码: 如果我摘下hh部分,那么它工作正常。否则,在hh部分中,即使传入的参数(毫秒数)为零,它也会显示诸如“ 07”之类的随机内容。 我对SimpleDateFormat类不太了解。谢谢你的帮助。 问题答案: 以下是
我的时间戳在Flatter Firestore快照中返回<code>时间戳(秒=1560523991,纳秒=286000000)。 我想把它打印成格式正确的日期和时间。 我正在使用将当前DateTime存储在Firestore中,同时创建新记录并使用Firestore快照检索它,但我无法转换为格式化的日期时间。我正在使用lib 进行格式化。 保存数据的代码 抛出的错误是 日期格式无效。 我希望输出
本文向大家介绍如何将Java LocalDateTime格式化为ISO_DATE_TIME格式,包括了如何将Java LocalDateTime格式化为ISO_DATE_TIME格式的使用技巧和注意事项,需要的朋友参考一下 首先,设置日期: 现在,将日期时间格式化为ISO_DATE_TIME格式: 示例 输出结果
For %U, all days in a new year preceding the first Sunday are considered to be in week 0. For %W, all days in a new year preceding the first Monday are considered to be in week 0. In some implementati
我有一个方法可以生成一个随机的日期和时间。 打印输出类似于 我见过几个这样的问题和页面,但他们没有给我一个线索。