Jodatime joda DateTimeFormat本地时区格式问题

Jodatime joda DateTimeFormat本地时区格式问题,jodatime,Jodatime,我从org.joda.time.DateTime开始,我想用一个相当于本地时区的时区偏移量来输出它。这实际上是为了方便用户用眼睛看时间(而不是用合适的ISO8601解析器解析时间) 我得到的是: 2020-02-01T05:00:00+0000 2020-02-01T00:00:00-0500 我想要的是: 2020-02-01T05:00:00+0000 2020-02-01T00:00:00-0500 它的输出对于我的时区来说是正确的,但我告诉了它。withZone(tz)和我(通过

我从org.joda.time.DateTime开始,我想用一个相当于本地时区的时区偏移量来输出它。这实际上是为了方便用户用眼睛看时间(而不是用合适的ISO8601解析器解析时间)

我得到的是:

2020-02-01T05:00:00+0000
2020-02-01T00:00:00-0500
我想要的是:

2020-02-01T05:00:00+0000
2020-02-01T00:00:00-0500
它的输出对于我的时区来说是正确的,但我告诉了它。withZone(tz)和我(通过调试器)确认tz实际上是美国/纽约

我使用的是jodatime 2.10.2。我在混音中也加入了jackson格式的jodatime,但我尝试了jackson out the loop,它的行为是一样的

说:

When printing, this zone will be used in preference to the zone from the datetime that would otherwise be used. 
否则将被打印的是UTC,但我不希望它这样做


我是否错误地解释了javadocs所说的内容?

如果您不反对Java答案(可能您的代码片段是Kotlin?),下面将根据您的需要格式化日期字符串,并处理时区转换

为了简单起见,我也没有像你提到的那样使用Jackson库

显然,您可以将下面的时区ID替换为起点所需的任何东西,例如
“UTC”
。或对于系统默认值,使用Joda时间:

DateTimeZone defaultZone = DateTimeZone.getDefault();
乔达时间 java.time 对于Java 8及以后的版本,如果可以使用
Java.time
,则
with zonesamainstant()
会相应地移动日期和时间:

//
// Using java.time (Java 8 onwards):
//

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

...
String pattern = "yyyy-MM-dd'T'HH:mm:ssZ";
String dateString;

DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern);
LocalDateTime localDateTime = LocalDateTime.parse("2020-02-21T09:30:45.123");
ZonedDateTime zonedDateTimeA = localDateTime.atZone(ZoneId.of("Europe/Paris"));

dateString = zonedDateTimeA.format(format); // "2020-02-21T09:30:45+0100"

ZonedDateTime zonedDateTimeB = zonedDateTimeA
        .withZoneSameInstant(ZoneId.of("America/New_York"));    
dateString = zonedDateTimeB.format(format); // "2020-02-21T03:30:45-0500"
对于使用
java.time
的默认时区,它是
ZoneId.systemDefault()

此外,这是一个惊人的概述

编辑:使用
java.time
而不是Joda time 问题的评论中提到了以下内容,但也需要在回答中说明:

如果可以,您绝对应该在Joda时间内使用
java.time

从乔达时代开始:

注意,从JavaSE8开始,用户被要求迁移到Java.time(JSR-310)——JDK的核心部分,它取代了这个项目

来自Joda Time的创造者之一:

我使用的措辞是java.time是“受Joda time启发的”,而不是一个确切的派生词,尽管很多概念都很熟悉


快速澄清:(1)
val
不是一个Java关键字-是来自Lombok吗?(2) 您使用的是什么版本的Java?(从Java8开始,
Java.time
比Joda time更受欢迎,但迁移可能不是您的选择)。如今,我在java和kotlin之间来回奔波,甚至连想都没想。是的,我使用的是GraalVM 11,所以我肯定可以使用java.time,这真的被大多数人认为是首选(即joda被认为是过时的)吗?joda time背后的好人在实现
java.time
方面起到了重要作用。他们建议不再使用Joda时间。见他们的笔记(“为什么乔达时间”部分)。