如何格式化具有短名称Id和longName的时区?

时间:2018-03-23 17:27:07

标签: java timezone jodatime timezone-offset

我有timezone = "[PST -08:00] America/Los Angeles (Pacific Standard Time)"格式。我有time["03:00 pm"]date[2018/4/22]。我需要检查当前当地时间是否少于12小时。

joda DateTimeZone不接受此ID [DateTimeZone.forID("[PST -08:00] America/Los Angeles (Pacific Standard Time)"]

任何选项?

这里我只关注时区选项。如何将时区字符串干净地转换为时区?

3 个答案:

答案 0 :(得分:1)

您应该只使用Continent/Region,格式为DateTimeZone.forID("America/Los_Angeles"); 。在这种情况下,您应该使用:

_

请注意,该名称为" Los _ Angeles",而不是"洛杉矶" (那里有DateTimeZone.getAvailableIDs()而不是 Los Angeles 之间的空格。

您可以通过循环for (String zoneName : DateTimeZone.getAvailableIDs()) { System.out.println(zoneName); } 返回的集合来检查所有可用的名称:

Map<String, String> names = new HashMap<String, String>();
names.put("[PST -08:00] America/Los Angeles (Pacific Standard Time)", "America/Los_Angeles");

在您的具体情况下,您应该解析字符串(正如Georg的答案解释)或将其映射到有效的IANA名称:

if (timezoneName.contains("Los Angeles")) {
    // use America/Los_Angeles
}

或使用其他一些逻辑,例如:

{{1}}

答案 1 :(得分:0)

您必须决定是否要解释长或短偏移。我去了长偏移,因为你可以用长名“America / Los_Angeles”创建一个ZoneId。然后,ZoneId查询IANA时区数据库 - 请参阅spec。此测试用例从给定的模式中提取名称。

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

public class Zone {

    @Test
    public void zoneId() throws ParseException {
        String zoneName = "[PST -08:00] America/Los Angeles (Pacific Standard Time)";
        String time = "03:00 pm";
        String dateString = "2018/4/22";

        String americaLosAngelesPST = zoneName.substring(zoneName.indexOf("]") + 2, zoneName.length());
        String americaLosAngeles = americaLosAngelesPST.substring(0, americaLosAngelesPST.indexOf("(") - 1).replace(" ", "_");
        ZoneId zone = ZoneId.of(americaLosAngeles);

        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy/MM/dd KK:mm a");
        Date parsedDateTime = inputFormat.parse(dateString + " " + time);

        ZonedDateTime inputZonedDateTime = parsedDateTime.toInstant().atZone(zone);

        // compare with ZonedDateTime.now()
    }

}

答案 2 :(得分:0)

还有一个java.time答案。我去找-08:00

    String offsetString = timezone.replaceFirst("\\[[^ ]+ ([+-]\\d{2}:\\d{2})\\].*", "$1");
    ZoneOffset offset = ZoneOffset.of(offsetString);

这给出了-08:00的偏移量。如果你确实需要一个时区,我喜欢别人去美国/洛杉矶,这是明确的,而三和四个字母的缩写不是标准化的,通常是模糊的,往往不是真正的时区。例如,PST可能意味着太平洋标准时间,菲律宾标准时间或皮特凯恩标准时间。但是,要确定时间是否在当地时间中午12点之前,偏移量就足够了,并且解析和使用都更简单。

有趣的是,您的整个时区字符串可以由DateTimeFormatter.ofPattern("'['zzz xxx']' VV (zzzz)", Locale.US) 解析(如果不是),因为时区以America/Los Angeles给出,城市名称中有空格。 IANA时区ID在那里有一个下划线。只是因为这个我需要在解析之前对字符串进行一些操作。然后我走了一路,取出了所需的偏移量。

Joda-Time处于维护模式,没有预见到重大改进,他们的开发团队建议迁移到java.time。我不知道Joda-Time,如果你愿意,我想你可以将我的答案翻译成Joda-Time。