Java 日历中的索引11以字符串形式将月份打印为;一月“;

Java 日历中的索引11以字符串形式将月份打印为;一月“;,java,calendar,utc,Java,Calendar,Utc,将2017年1月1日00:00:00 NPT转换为utc时,结果是11(日历中的月指数)31 2016 18:15:00,这是可以的。但是如果我从索引11中提取月份作为字符串,它会给我一月,必须是十二月。 实际代码 Date date = new Date(1483208100000L); System.out.println("date: " + date); System.out.println("\nUTC with month as index::::"); Calendar cale

将2017年1月1日00:00:00 NPT转换为utc时,结果是11(日历中的月指数)31 2016 18:15:00,这是可以的。但是如果我从索引11中提取月份作为字符串,它会给我一月,必须是十二月。
实际代码

Date date = new Date(1483208100000L);
System.out.println("date: " + date);

System.out.println("\nUTC with month as index::::");
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTime(date);

System.out.println("Year: " + calendar.get(Calendar.YEAR) + ", month: " + calendar.get(Calendar.MONTH) + ", day: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("hours: " + calendar.get(Calendar.HOUR_OF_DAY) + ", minutes: " + calendar.get(Calendar.MINUTE) + ", seconds: " + calendar.get(Calendar.SECOND));


System.out.println("\nUTC with month as String::::");     
String month = new SimpleDateFormat("MMMM").format(calendar.getTime());       
System.out.println("Year: " + calendar.get(Calendar.YEAR) + ", month: " + month + ", day: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("hours: " + calendar.get(Calendar.HOUR_OF_DAY) + ", minutes: " + calendar.get(Calendar.MINUTE) + ", seconds: " + calendar.get(Calendar.SECOND));
代码输出

date: Sun Jan 01 00:00:00 NPT 2017

UTC with month as index::::
Year: 2016, month: 11, day: 31
hours: 18, minutes: 15, seconds: 0

UTC with month as String::::
Year: 2016, month: January, day: 31
hours: 18, minutes: 15, seconds: 0
您的代码输出如下:

date: Sat Dec 31 18:15:00 GMT 2016

UTC with month as index::::
Year: 2016, month: 11, day: 31
hours: 18, minutes: 15, seconds: 0

UTC with month as String::::
Year: 2016, month: December, day: 31
hours: 18, minutes: 15, seconds: 0

在我看来,这是正确的

String month=new SimpleDateFormat(“MMMM”).format(calendar.getTime())//此行“calendar.getTime())”将UTC时间转换回具有月份“0”索引的本地时间,即一月。所以它是一月份回来的。修好了。所以,我从索引中提取了月份,它是:::String monthName=new DateFormatSymbols().getMonths()[calendar.get(calendar.month)];我只是在运行返回1月份的代码后从控制台复制了输出。:)您的输出是不可复制的,但在我的测试中,输出就像@gzp_uuu描述的一样,所以一切都很好。我强烈怀疑您只是对方法
java.util.Date.toString()
的行为感到困惑,该方法使用了与UTC不同的时区,因此甚至可以生成另一个月(NPT的1月,UTC的12月)。如果未将区域设置为
SimpleDataFormat
,则格式化程序将使用您的系统区域,而不是UTC。calendar.getTime()返回日期并将时间转换为本地时间。我在eclipse中进行了测试。因此,我从日历中按索引提取了月份名称。:)我希望您尝试运行上述代码并看到输出是的,在编写第一条注释之前,我已经运行了您的代码。我无法复制。但我也给出了一个提示,您应该将格式化程序上的时区设置为UTC,以避免输出示例最后一行中出现“一月”。哦,是的,我尝试在SimpleDataFormat上设置时区,并获得了所需的输出。我还修复了以下问题:String monthName=new DateFormatSymbols().getMonths()[calendar.get(calendar.MONTH)];谢谢!:)