我经常使用HH:mm:ss
或yyyy-MM-dd
这样的模式创建SimpleDateFormat,以独立的方式输出日期。由于还有一个构造函数采用了额外的语言环境参数,我想知道是否存在这样的格式可能依赖于语言环境的情况,或者我是否应该始终指定Locale.ENGLISH或Locale.GERMANY。让我们假设时区是明确设置的。
答案 0 :(得分:15)
在Locale上找到了getAvailableLocales
静态方法,结果发现日历的所有字段都可以依赖于语言环境:
public static void main(String[] args) {
String pattern = "yyyy-MM-dd HH:mm:ss";
Date date = new Date();
String defaultFmt = new SimpleDateFormat(pattern).format(date);
for (Locale locale : Locale.getAvailableLocales()) {
String localeFmt = new SimpleDateFormat(pattern, locale).format(date);
if (!localeFmt.equals(defaultFmt)) {
System.out.println(locale + " " + localeFmt);
}
}
}
在我的系统上(在德国运行英文版的ubuntu),输出以下列表,希望unicode字符完好无损:
ja_JP_JP 23-03-03 16:53:09
hi_IN २०११-०३-०३ १६:५३:०९
th_TH 2554-03-03 16:53:09
th_TH_TH ๒๕๕๔-๐๓-๐๓ ๑๖:๕๓:๐๙
所以Japan和Thailand使用不同的纪元,但是基于gregorian calendar,这解释了为什么月份和日期是相同的。
其他语言环境也使用不同的脚本来编写数字,例如印度使用的Hindi和泰国的泰语版本。
要回答这个问题,当需要区域设置独立的String时,应始终将语言环境指定为已知值。
编辑:Java 1.6添加了一个常量Locale.ROOT来指定语言/国家/地区中性语言环境。这将优先指定针对计算机的输出的英语区域设置。
根区域设置是其语言,国家/地区和变体为空(“”)字符串的区域设置。这被视为所有语言环境的基本语言环境,并用作语言环境敏感操作的语言/国家/地区中性语言环境。
答案 1 :(得分:4)
是的,SimpleDateFormat
绝对是区分设置敏感的。某些字段(如小时和分钟)与区域设置无关。
SimpleDateFormat
还支持本地化的日期和时间模式字符串。在这些字符串中,上述模式字母可以用其他依赖于语言环境的模式字母替换。SimpleDateFormat
不处理模式字母以外的文本本地化;这取决于班级的客户。
或者,您可以使用本地化友好的DateFormat#getDateInstance()
工厂方法,因为:
public SimpleDateFormat(String pattern, Locale locale)
使用给定模式和给定语言环境的默认日期格式符号构造
SimpleDateFormat
。注意:此构造函数可能不支持所有语言环境。要获得完整的覆盖率,请使用DateFormat
类中的工厂方法。
答案 2 :(得分:-1)
这对我有用,也许你应该尝试一下:
String time = new SimpleDateFormat("HH:mm:ss").format(new Date());
控制台输出:
11:52:45