Java似乎不接受Romance作为时区别名。它应该是什么?

时间:2009-09-18 17:56:03

标签: java datetime groovy timezone

我正在尝试从Groovy中的另一个应用程序转换日期字符串。就像是 “18-sep-2009 10:25:11浪漫夏令时”

看起来Java并不把Romance理解为时区别名。 “18-sep-2009 10:25:11太平洋夏令时”工作正常。

除了解析字符串并用Java理解的东西替换“Romance Daylight Time”之外,还有其他方法吗?如果没有,那么对于欧洲/巴黎时区应该是什么呢?

2 个答案:

答案 0 :(得分:3)

尝试“中欧时间”。这是这个短程序的输出:

import java.util.*;

public class Test
{    
    public static void main(String[] args)
    {
        TimeZone tz = TimeZone.getTimeZone("Europe/Paris");
        System.out.println(tz.getDisplayName());
    }
}

(我觉得我几乎不得不建议使用Joda Time,但我不确定是否有足够的证据可以在这种情况下提出它而不是一般原则,所以我只是留下这个括号内的评论...... )

答案 1 :(得分:0)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

另外,下面引用的是来自 home page of Joda-Time 的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用 java.time(现代日期时间 API)的解决方案:有两件事需要解决:

  1. 将日期时间字符串更改为 standard name of the timezone,即 Europe/Paris
  2. 使用 DateTimeFormatterBuilder 构建不区分大小写的解析器。

演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "18-sep-2009 10:25:11 Europe/Paris";
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .parseCaseInsensitive()
                                    .appendPattern("dd-MMM-uuuu HH:mm:ss zzzz")
                                    .toFormatter(Locale.ENGLISH);
        
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2009-09-18T10:25:11+02:00[Europe/Paris]

ONLINE DEMO

但是,如果更改日期时间字符串不在您的控制范围内,即您想使用 Romance Daylight Time 本身,java.time 为您提供了一种干净的方式来处理它。在使用 java.time API 之前,您需要准备的只是一个 Map,其中包含所有此类非标准时区名称。

演示:

import java.text.ParsePosition;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "18-sep-2009 10:25:11 Romance Daylight Time";
        Map<String, String> zoneIdMap = Map.of("Romance Daylight Time", "Europe/Paris");

        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .parseCaseInsensitive()
                                    .appendPattern("dd-MMM-uuuu HH:mm:ss")
                                    .toFormatter(Locale.ENGLISH);

        ZonedDateTime zdt = LocalDateTime.from(dtf.parse(strDateTime, new ParsePosition(0)))
                                .atZone(ZoneId.of("Romance Daylight Time", zoneIdMap));
        System.out.println(zdt);
    }
}

输出:

2009-09-18T10:25:11+02:00[Europe/Paris]

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project