【问题标题】:Index 11 from Calendar prints months in string as "January"日历中的索引 11 将字符串中的月份打印为“一月”
【发布时间】:2026-01-07 20:45:02
【问题描述】:

在转换jan 01 2017 00:00:00 NPT to 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

【问题讨论】:

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

标签: java calendar utc


【解决方案1】:

您的代码输出如下:

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)];
  • 我刚刚在运行返回一月份的代码后从控制台复制了输出。 :)