如何为joda DateTime对象指定时区?

2022-09-03 12:32:23

我有一个函数,可以将字符串转换为joda时间对象并设置其格式。

public static String getFormattedDatetime(String someDate) {
    DateTime newDate = DateTime.parse(someDate, DateTimeFormat.forPattern("yy-MM-dd HH:mm:ss.SSS")).minusHours(7);
    String formattedDate = newDate.toString("dd-MMM-yy hh:mm a");

    return formattedDate;
}

该函数采用字符串并返回格式化的DateTime,但是我在为其分配时区时遇到问题。我传入的字符串表示我需要转换为 PST/PDT 的数据库中的 UTC 时间。我无法找到一种方法来1)为新的DateTime对象分配一个时区,2)将该对象的时区转换为PST / PDT。现在我正在用.minusHours处理这个问题。当然不理想。


答案 1

在任何情况下都不应该使用 .minusHours(7),因为它在半年内会出错, 而 DateTime 对象仍然会认为它是 UTC。

.withZone(DateTimeZone.forID("America/Los_Angeles"));

以下是Joda Time支持的所有时区及其相应ID的列表

我建议将调用生成的常量重构到代码中合适的字段,并在需要执行转换的任何地方使用它。forID()static final


您可能知道,但为了安全起见,对象是不可变的,这意味着调用将返回一个全新的实例,并且不会更改原始对象的区域。DateTimewithZoneDateTime


@anotherdave在评论中提出了一个很好的观点。您在问题中说PST,但PST仅在半年内使用(因为夏令时)。我以为你指的是洛杉矶,西雅图等地的当前时间,而不是特别的PST区域,因为这些城市在一年中的另一半年使用PDT。但是,如果您确实想要PST 100%的时间,则可以使用forID("PST");


答案 2

更新:如果有人只想更改时区,而不是实际的日期。然后您可以使用以下代码:

DateTime dateTime = DateTime.parse(date.toString(), DateTimeFormat.forPattern("yyyy-MM-dd")).withZoneRetainFields(DateTimeZone.forID("PST"));  // it will change timezone to PST but not the actual date field value.

推荐