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

16
我有一个函数,可以将字符串转换成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,但我在为其分配TimeZone方面遇到了问题。我传递的字符串表示从数据库中检索出的UTC时间,我需要将其转换为PST / PDT。我无法找到一种方法来:1)为新的DateTime对象分配时区;2)将该对象的时区转换为PST/PDT。目前我正在使用.minusHours处理这个问题。显然并不理想。

3个回答

29
绝不能使用.minusHours(7),因为这将在一年中错误一半,并且DateTime对象仍然认为它在UTC中。 使用.withZone(DateTimeZone.forID("America/Los_Angeles")); 这里是Joda Time支持的所有时区及其相应的ID列表 我建议将forID()调用生成的常量重构为适当位置的static final字段,并在需要进行转换的所有地方都使用它。
您可能已经意识到,但为了安全起见,DateTime对象是不可变的,这意味着withZone调用将返回一个全新的DateTime实例,并且不会更改原始对象的区域设置。
@anotherdave在评论中提出了一个很好的观点。您在问题中提到了PST,但由于夏令时的缘故,PST仅在一年的一半使用。我假设您指的是洛杉矶、西雅图等地当前的时间,而不是具体的PST区域,因为这些城市在一年的另一半使用PDT。但是,如果您确实希望100%使用PST,则可以使用forID(“PST”);

2
此外,除非您特别需要“PST”,而不是例如“洛杉矶的当前时间”,否则我建议使用durron的示例“America/Los_Angeles”,而不是DateTimeZone.forID("PST")。按地区名称调用应该会在夏令时期间返回PDT,而按PST调用将始终返回PST。 - anotherdave
我已经尝试过了,像这样:DateTime newDate = DateTime.parse(someDate, DateTimeFormat.forPattern("yy-MM-dd HH:mm:ss.SSS")).withZone(DateTimeZone.forID("America/Los_Angeles")); 但它仍然没有转换日期。这段代码只是给我的对象分配了一个时区,而没有实际转换它吗?我需要先分配一个UTC时区,然后再转换为PST吗? - BarFooBar
@QuidFacis 我的帖子是对你所提出的问题的正确答案。如果你已经尝试过那个方案,但它并没有产生你想要的行为,请编辑你的问题,包括确切的字符串输入、你使用的确切调用、你期望的结果对象应该是什么,以及实际得到的结果对象是什么。 - durron597
@durron597 根据问题指定,输入是一个字符串,在函数内被解析为DateTime对象。输入并不重要,因为该解析方法总是以函数指定的格式返回有效的DateTime对象。任何DateTime对象都应该能够适用时区方法,不是吗? - BarFooBar
@QuidFacis 如果我不知道问题出在哪里,我就无法帮助你。如果我的回答没有解决你的问题,那么显然我并不完全理解出了什么问题。我建议你进行编辑以更准确地让我了解你遇到的问题。请阅读这篇帮助中心文章这篇文章以获取更多细节信息 - durron597

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.

0

已解决:

public static String getFormattedDatetime(String someDate) {

    DateTime newDate = DateTime.parse(someDate, DateTimeFormat.forPattern("yy-MM-dd  HH:mm:ss.SSS"));
        LocalDateTime zonedDate = LocalDateTime.parse(newDate, DateTimeFormat.forPattern("yy-MM-dd HH:mm:ss.SSS"));
        DateTime finalZonedDate = zonedDate.toDateTime(DateTimeZone.UTC);
        String formattedDate = newDate.toString("dd-MMM-yy hh:mm a");
        return formattedDate;
    }

我在将字符串转换为变量时,不得不使用joda的LocalDateTime类来分配一个时区。然后我需要单独转换时区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接