java.util.Date语言环境中的toString()方法是否独立?
正如API告诉我java.util.Date.toString()的格式类似于“dow mon dd hh:mm:ss zzz yyyy”,我只想知道当windows语言环境更改时,toString()的内容格式是否会更改?如“俄语”、“英语”,建议输入相同,检查日期值是否相同?谢谢您的帮助。java.util.Date语言环境中的toString()方法是否独立?,java,java.util.date,Java,Java.util.date,正如API告诉我java.util.Date.toString()的格式类似于“dow mon dd hh:mm:ss zzz yyyy”,我只想知道当windows语言环境更改时,toString()的内容格式是否会更改?如“俄语”、“英语”,建议输入相同,检查日期值是否相同?谢谢您的帮助。Date.toString()与区域设置无关。您所能观察到的最重要的变化是时区,这取决于计算机的时区设置。这是 将此日期对象转换为以下格式的字符串: try { SimpleDat
Date.toString()
与区域设置无关。您所能观察到的最重要的变化是时区,这取决于计算机的时区设置。这是
将此日期对象转换为以下格式的字符串:
try {
SimpleDateFormat strTemp = new SimpleDateFormat("ddMMMyy", Locale.US);
Date reasult = strTemp.parse(input);
String checkDate = reasult.toString().substring(8, 10) + reasult.toString().substring(4, 7) + reasult.toString().substring(26);
if (!checkDate.toUpperCase().equals(input))
return false;
else
return true;
} catch (Exception ex) {
return false;
}
其中:
- 道琼斯指数是一周中的一天(
,Sun
,Mon
,Tue
,Wed
,Thu
,Fri
)Sat
是月份(mon
,Jan
,Feb
,Mar
,Apr
,May
,Jun
,Jul
,Aug
,Sep
,Oct
,Nov
,Nov
Dec>)
是一个月的第几天(dd
到01
),以两位十进制数字表示31
是一天中的小时(hh
到00
),以两位十进制数字表示23
是小时内的分钟(mm
到00
),为两位十进制数字59
是一分钟内的第二位(ss
到00
),为两位十进制数字61
是时区(可能反映夏令时)。标准时区缩写包括解析方法识别的缩写。如果时区信息不可用,则zzz
为空-即它根本不包含任何字符zzz
是年份,以四位小数表示yyy
它不会因其独立于区域设置而更改。以前有
toLocaleString()
,但现在已弃用
你可以看到代码-
dow mon dd hh:mm:ss zzz yyyy
小心时区!除此之外,不,它不会根据区域设置而改变。检查
java.util.Date.toString()方法的源代码(这总是一个好主意!):
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
wtb是一个私有的最终静态字符串:
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' ');
...
所以,不,它不会改变,它永远是英文名字
更新:正如@nhahtdh所指出的,时区将根据计算机区域配置的设置而变化通常toString()
负责转换为字符串。本地系统上的区域设置变化与否无关
private final static String wtb[] = {
"am", "pm",
"monday", "tuesday", "wednesday", "thursday", "friday",
"saturday", "sunday",
"january", "february", "march", "april", "may", "june",
"july", "august", "september", "october", "november", "december",
"gmt", "ut", "utc", "est", "edt", "cst", "cdt",
"mst", "mdt", "pst", "pdt"
};
它可以自动与您的区域设置一起工作。上述代码也可以正常工作。一般来说,除了一次性代码,您不应该依赖任何类的toString(),因为它可能会从一个版本更改为另一个版本。对于日期,我建议使用DateFormat来保证输出格式。解析toString()也是不雅观和低效的。最好在这种情况下使用日历。@Igns是的。Henry为什么要进行此检查?您不相信SimpleDateFormat能正确解析日期吗?如果您想检查其行为,最好编写一个测试,在其中输入值(有些错误,有些正确)并检查它是否可以按您的意愿处理它们。这是由NHAHDH所说的时区引起的。格式“dow mon dd hh:mm:ss zzz yyyy”没有调整到每个时区,并导致子字符串收集错误字符。您的意思是当使用Date.toString()时,它将始终输出“dow mon dd hh:mm:ss ZZZZ yyyy”?它是不相关的windows区域设置?@Henry:无论区域设置如何,格式和星期几/月份名称都是相同的。嗯……子字符串只是收集单独的部分并将其浓缩到“ddMMMyy”,在不同的windows区域设置和时区下安全吗?当我的客户报告我一个错误时,我确信这是在这些代码中发生的。@Henry:你可以看看其他答案或GrepCode上的源代码-我没有看到任何迹象表明它依赖于区域设置(但它确实依赖于时区)。关于bug,您可能会感兴趣:
//Now my local date time (US & CANADA)
Date dt1=new Date();
System.out.println("Date is ::"+dt1.toString());