【发布时间】: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)]; 提出问题后,我也修复了它。谢谢! :)