簡體   English   中英

Java 似乎不接受 Romance 作為時區別名。 應該是什么?

[英]Java does not seem to accept Romance as timezone alias. What should it be?

我正在嘗試從 Groovy 中的另一個應用程序轉換日期字符串。 類似於“18-sep-2009 10:25:11 Romance Daylight Time”

看起來 Java 不理解 Romance 作為時區別名。 “2009 年 9 月 18 日 10:25:11 太平洋夏令時”工作正常。

除了解析字符串並用Java理解的內容替換“浪漫夏令時”之外,還有其他解決方法嗎? 如果不是,歐洲/巴黎時區應該是什么?

試試“中歐時間”。 這是這個短程序的輸出:

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 ,但我不確定在這種情況下除了一般原則之外是否有足夠的證據表明它,所以我只會留下這個括號評論......)

時間

java.util Date-Time API 及其格式化 API SimpleDateFormat已過時且容易出錯。 建議完全停止使用它們並切換到現代 Date-Time API *

另外,下面引用的是來自Joda-Time主頁的通知:

請注意,從 Java SE 8 開始,要求用戶遷移到 java.time (JSR-310) - 替代該項目的 JDK 的核心部分。

使用現代日期時間 API java.time解決方案:有兩件事需要解決:

  1. 更改日期時間字符串以具有時區標准名稱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]

在線演示

但是,如果更改日期時間字符串不在您的控制范圍內,即您想使用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]

在線演示

Trail: Date Time 中了解有關現代日期時間 API 的更多信息。


* 出於任何原因,如果您必須堅持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它將大部分java.time功能向后移植到 Java 6 和 7。如果您正在為 Android 項目和您的 Android API 工作級別仍然不符合 Java-8,請檢查 通過 desugaringHow to use ThreeTenABP in Android Project 可用的 Java 8+ APIs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM