Java 为什么日期输出看起来像这样?

Java 为什么日期输出看起来像这样?,java,Java,我试图理解如何将日期转换为俄语日期格式。我使用SimpleDataFormat, Date和DateFormat类来实现这一点。我的代码示例如下: static void convertToRusDate(String dateStr) throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ"

我试图理解如何将日期转换为俄语日期格式。我使用SimpleDataFormat, Date和DateFormat类来实现这一点。我的代码示例如下:

static void convertToRusDate(String dateStr) throws ParseException {
    SimpleDateFormat   simpleDateFormat          = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
    Date       date                      = simpleDateFormat.parse(dateStr);
    DateFormat russianLanguageDateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("ru"));
    System.out.println("Date in the Russian language format: " + russianLanguageDateFormat.format(date));
}

public static void main(String[] args) throws ParseException {
    convertToRusDate("2012-01-31 23:59:59.999+0100");
}
我看到的结果如下所示:

Date in the Russian language format: 01.02.2012
为什么输出看起来像2012年2月1日而不是2012年1月31日

你能帮忙吗

谢谢,
Alexey

您的
russianLanguageDateFormat
将在指定的
区域设置中显示日期。它不会更改显示日期的时区,默认情况下,该时区将是您自己的系统时区。我的系统字体上没有俄语字符,所以我将其改为
新语言环境(“en-uk”)
。我还使用了
getDateTimeInstance
而不是
getDateInstance
,因此很清楚发生了什么

DateFormat英语语言DateFormat=
DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL,
//新地区(ru);
新地区(“英国”);
System.out.println(“英语格式的日期:”+
englishLanguageDateFormat.format(date));
…将给我:

英语格式日期:2012年1月31日,星期二23:59:59中欧时间
…因为我(我的系统)在GMT+1,从时区可以看出:

System.out.println(“englishLanguageDateFormat.getTimeZone():”+
englishLanguageDateFormat.getTimeZone());
…打印并对应于我的操作系统设置:

englishLanguageDateFormat.getTimeZone():sun.util.calendar.ZoneInfo[id=“Europe/Paris”,偏移量=3600000,DSTSCAvings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,DStSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startDayOfWeek=1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
您可以使用更改格式化字符串的时区

englishLanguageDateFormat.setTimeZone(TimeZone.getTimeZone(“美国/洛杉矶”);
System.out.println(“englishLanguageDateFormat.getTimeZone():”+
englishLanguageDateFormat.getTimeZone());
System.out.println(“英语格式的日期:”+
englishLanguageDateFormat.format(date));
…将打印:

englishLanguageDateFormat.getTimeZone():sun.util.calendar.ZoneInfo[id=“America/Los_Angeles”,偏移量=-2880000,DSTSCAvings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-2880000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDayOfWeek=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
英语格式的日期:2012年1月31日星期二14:59:59太平洋标准时间

您的
russianLanguageDateFormat
将在指定的
区域设置中显示日期。它不会更改显示日期的时区,默认情况下,该时区将是您自己的系统时区。我的系统字体上没有俄语字符,因此我将其更改为
新区域设置(“英国”)
。我还使用了
getDateTimeInstance
而不是
getDateInstance
,所以很清楚发生了什么

DateFormat英语语言DateFormat=
DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL,
//新地区(ru);
新地区(“英国”);
System.out.println(“英语格式的日期:”+
englishLanguageDateFormat.format(date));
…将给我:

英语格式日期:2012年1月31日,星期二23:59:59中欧时间
…因为我(我的系统)在GMT+1,从时区可以看出:

System.out.println(“englishLanguageDateFormat.getTimeZone():”+
englishLanguageDateFormat.getTimeZone());
…打印并对应于我的操作系统设置:

englishLanguageDateFormat.getTimeZone():sun.util.calendar.ZoneInfo[id=“Europe/Paris”,偏移量=3600000,DSTSCAvings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,DStSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startDayOfWeek=1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
您可以使用更改格式化字符串的时区

englishLanguageDateFormat.setTimeZone(TimeZone.getTimeZone(“美国/洛杉矶”);
System.out.println(“englishLanguageDateFormat.getTimeZone():”+
englishLanguageDateFormat.getTimeZone());
System.out.println(“英语格式的日期:”+
englishLanguageDateFormat.format(date));
…将打印:

englishLanguageDateFormat.getTimeZone():sun.util.calendar.ZoneInfo[id=“America/Los_Angeles”,偏移量=-2880000,DSTSCAvings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-2880000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDayOfWeek=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
英语格式的日期:2012年1月31日星期二14:59:59太平洋标准时间

格式字符串中的
Z
表示与UTC的“零偏移”,而输入日期