使用DateFormat的实例格式化和解析Java Date(或Calendar)类非常容易,即我可以将当前日期格式化为短的本地化日期,如下所示:
DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
String today = formatter.format(new Date());
Run Code Online (Sandbox Code Playgroud)
我的问题是:我需要获得这个本地化的模式字符串(即类似的东西"MM/dd/yy").这应该是一项微不足道的任务,但我找不到提供者......
是否有可能从joda-time DateTimeFormatter获取模式字符串?
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd");
String originalPattern = formatter. ???
Run Code Online (Sandbox Code Playgroud) import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class Test001 {
public static void main(String[] args) {
Date dt = new Date();
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS zzz").withZone(ZoneId.of("America/New_York"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz");
System.out.println(formatter.format(localDateTime));
System.out.println(sdf.format(dt));
}
}
Run Code Online (Sandbox Code Playgroud)
2016-04-19 11:25:34.917 ET
2016-04-19 11:25:34.637 EDT
Run Code Online (Sandbox Code Playgroud)
我的笔记本电脑的时区是"美国/纽约"(即东部时间美国/加拿大).
我想知道如何使用"EDT"代替"ET" DateTimeFormatter.
我也想知道:为什么在解析/格式模式方面DateTimeFormatter不兼容SimpleDataFormat(因为这个例子表明它们不兼容).
我在看的DateTimeFormatter班,我想知道在那里就像是常数"M","EEE"和"YY"等被定义.更具体地讲,应该是这样的地方给一个代码ChronoField和TextStyle,它应该返回的DateTimeFormatter字符串片断如(ChronoField.MONTH_OF_YEAR, TextStyle.SHORT)要映射到的字符串"MMM"
TL;DR:我如何从区域设置和短/中/长等到模式字符串来解析日期。
完整版本:
访问特定于区域设置的日期格式的模式似乎是 Java 中没有很好解决的问题。
这是在以下背景下
由于第一个问题的 JDK 特定性和第二个问题的实现特定性,我将这个问题带回来,这次以非特定于版本的方式回答,距 2017 年很久之后(日期第一个问题):
使用案例:
在用户界面上,显示输入时将用于解析日期的日期格式:例如,对于Locale.USdisplay start date (M/d/yy),用于在输入旁边Locale.GERMANY显示(或者在 HTML 中,作为占位符)。Startdatum (dd.MM.yy)
只要它仍然有效,实现这一点是微不足道的
DateFormat usFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
DateFormat deFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY);
System.out.println(((SimpleDateFormat) usFormat).toPattern()); // M/d/yy
System.out.println(((SimpleDateFormat) deFormat).toPattern()); // dd.MM.yy
Run Code Online (Sandbox Code Playgroud)
但这段代码涉及旧的 API 和特定于实现的类型转换 - 两者都是我不太有信心使用的假设。
维护我自己的特定于区域设置的模式库似乎更不明智,但由于 DateTime API 不授予对其内部模式的任何访问权限(它们必须在那里):
有没有一种方法能够以面向未来的方式解决这个问题?
由于上面的链接问题,这可能涉及特定的最小 Java 版本,这很好。我目前仍然必须兼容 8 和 11,但这可以进一步推动版本,或者为在较新的 Java …