java.util.Date语言环境中的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

正如API告诉我java.util.Date.toString()的格式类似于“dow mon dd hh:mm:ss zzz yyyy”,我只想知道当windows语言环境更改时,toString()的内容格式是否会更改?如“俄语”、“英语”,建议输入相同,检查日期值是否相同?谢谢您的帮助。

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());