![](/img/trans.png)
[英]What arguments should add function accept for generic set<E> in java?
[英]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
解決方案:有兩件事需要解決:
演示:
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,請檢查 通過 desugaring和How to use ThreeTenABP in Android Project 可用的 Java 8+ APIs 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.