【问题标题】:Java SimpleDateFormat parse Timezone like America/Los_AngelesJava SimpleDateFormat 解析时区,如 America/Los_Angeles
【发布时间】:2014-06-08 03:54:44
【问题描述】:

我想在 Java 中解析以下字符串并将其转换为日期:

DTSTART;TZID=America/Los_Angeles:20140423T120000

我试过了:

SimpleDateFormat sdf = new SimpleDateFormat("'DTSTART;TZID='Z':'yyyyMMdd'T'hhmmss");
Date start = sdf.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000");

还有这个:

SimpleDateFormat sdf = new SimpleDateFormat("'DTSTART;TZID='z':'yyyyMMdd'T'hhmmss");
Date start = sdf.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000");

但它仍然不起作用。我认为问题出在美国/洛杉矶。 你能帮帮我吗?

谢谢

【问题讨论】:

    标签: java parsing timezone


    【解决方案1】:

    使用TimeZone试试这个。

    注意:在执行此操作之前,您必须拆分日期字符串。

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'hhmmss");
    
        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
        sdf.setTimeZone(tz);
    
        Date start = sdf.parse("20140423T120000");
    

    SimpleDateFormat 模式中Z 代表RFC 822 4-digit time zone

    更多信息请查看SimpleDateFormat#timezone

    【讨论】:

    • 可能这个工作,但它不是我需要的。因为我得到一个字符串,例如:DTSTART;TZID=America/Los_Angeles:20140423T120000。只有当我首先解析字符串时,我才能使用你的解决方案,而不是使用子字符串等等。我正在寻找更快的东西。
    • @LorenzoTassone 您过早地进行优化,这是一种不好的做法。 Java 非常快。拆分和解析字符串是一个合适的解决方案。
    • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等存在严重缺陷的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.
    【解决方案2】:

    如果您正在寻找一种解决方案,如何一步一步解析整个给定字符串,那么 Java 8 提供此选项(SimpleDateFormat 不支持模式符号 V):

    // V = timezone-id, HH instead of hh for 24-hour-clock, u for proleptic ISO-year
    DateTimeFormatter dtf = 
      DateTimeFormatter.ofPattern("'DTSTART;TZID='VV:uuuuMMdd'T'HHmmss");
    ZonedDateTime zdt = 
      ZonedDateTime.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000", dtf);
    Instant instant = zdt.toInstant();
    
    // if you really need the old class java.util.Date
    Date jdkDate = Date.from(instant);
    

    【讨论】:

    • 这个答案应该是被接受的,因为它使用 Java 8 的 Time API。
    • 为什么 V 两次,而不是一次?
    • @Line 因为 CLDR 标准只定义了两个字母 VV 作为有效符号(java.time-designers 决定在大多数情况下遵循它)。来自DateTimeFormatter类的javadoc的引用:ZoneId: This outputs the time-zone ID, such as 'Europe/Paris'. If the count of letters is two, then the time-zone ID is output. Any other count of letters throws IllegalArgumentException.
    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 2019-09-01
    • 2011-12-18
    • 2011-09-30
    • 2020-09-28
    • 2012-04-22
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多