使用时区打印 kotlinx 日期时间

Print kotlinx datetime with timezone

提问人:nilsi 提问时间:4/14/2023 最后编辑:nilsi 更新时间:4/17/2023 访问量:284

问:

我通过调用 kotlinx.datetime 创建一个 Instant 。Clock.System.now()

我想将其转换为具有添加时区的字符串。

所以它看起来像这样.(国际标准化组织-8601)2023-01-06T00:00:00.000+01:00

实现这一目标的最佳方法是什么?

Android Kotlin 日期时间

评论


答:

-1赞 MexiCano 4/15/2023 #1

用:

静态 val RFC_1123_DATE_TIME: DateTimeFormatter!

例:

使用与RFC_1123_DATE_TIME相同的格式创建

DateTimeFormatter fmt = new DateTimeFormatterBuilder()

    .parseCaseInsensitive()
    .parseLenient()
    .optionalStart()
    .appendText(DAY_OF_WEEK, dow)
    .appendLiteral(", ")
    .optionalEnd()
    .appendValue(DAY_OF_MONTH, 1, 2, SignStyle.NOT_NEGATIVE)
    .appendLiteral(' ')
    .appendText(MONTH_OF_YEAR, moy)
    .appendLiteral(' ')
    .appendValue(YEAR, 4)  // 2 digit year not handled
    .appendLiteral(' ')
    .appendValue(HOUR_OF_DAY, 2)
    .appendLiteral(':')
    .appendValue(MINUTE_OF_HOUR, 2)
    .optionalStart()
    .appendLiteral(':')
    .appendValue(SECOND_OF_MINUTE, 2)
    .optionalEnd()
    .appendLiteral(' ')
    // difference from RFC_1123_DATE_TIME: optional offset OR zone ID
    .optionalStart()
    .appendZoneText(TextStyle.SHORT)
    .optionalEnd()
    .optionalStart()
    .appendOffset("+HHMM", "GMT")
    // use the same resolver style and chronology
    .toFormatter().withResolverStyle(ResolverStyle.SMART).withChronology(IsoChronology.INSTANCE);

结果是:

With this formatter, I can parse the inputs:
System.out.println(Instant.from(fmt.parse("Mon, 21 Aug 2017 15:00:00 EST")));
System.out.println(Instant.from(fmt.parse("Sun, 20 Aug 2017 00:30:00 UT")));
0赞 nilsi 4/17/2023 #2

我最终为此创建了一个扩展函数并使用了格式化程序。

// 2023-04-17T10:16:45.205+02:00
fun Instant.formatTimestampWithZoneOffset(): String =
    DateTimeFormatter
        .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
        .withZone(ZoneId.of("Europe/Stockholm"))
        .format(this.toJavaInstant())