Java 日历不一致的结果

标签 java date calendar

我已经搜索过这个问题的答案,但似乎找不到。有人可以解释为什么下面的代码不给我每个月的 1,而是跳到 31 几个月吗?用于需要确定下个月日期的报告事件。

DateFormat formatter = new SimpleDateFormat("dd-MMM-yy"); 
Calendar cal = Calendar.getInstance( TimeZone
    .getTimeZone( "America/Los_Angeles" ) );
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy"); 
Date date;
try
{
  date = (Date)formatter.parse("01-JUN-12");
  cal.setTime(date);
  //cal.set(2012, 05, 01);

  long now = new Date().getTime();
  int frequency = 1;

  System.out.println("Current calendar time=" + cal.getTime().toString()) ;

  while (cal.getTime().getTime() < now)
  {
      cal.add( Calendar.MONTH, frequency );
      System.out.println("In loop - current calendar time=" + cal.getTime().toString()) ;
  }
}
catch (ParseException e)
{
  // TODO Auto-generated catch block
  e.printStackTrace();
} 

输出是:

Current calendar time=Fri Jun 01 00:00:00 EDT 2012

In loop - current calendar time=Sun Jul 01 00:00:00 EDT 2012

In loop - current calendar time=Tue Jul 31 00:00:00 EDT 2012

In loop - current calendar time=Fri Aug 31 00:00:00 EDT 2012

In loop - current calendar time=Mon Oct 01 00:00:00 EDT 2012

In loop - current calendar time=Wed Oct 31 00:00:00 EDT 2012

注意它是如何跳到 31,然后又跳回 1 的。如果我改用 Calendar.set(),输出是正确的:

Current calendar time=Fri Jun 01 15:14:26 EDT 2012

In loop - current calendar time=Sun Jul 01 15:14:26 EDT 2012

In loop - current calendar time=Wed Aug 01 15:14:26 EDT 2012

In loop - current calendar time=Sat Sep 01 15:14:26 EDT 2012

In loop - current calendar time=Mon Oct 01 15:14:26 EDT 2012

In loop - current calendar time=Thu Nov 01 15:14:26 EDT 2012

这似乎是 1) 日历 API 的错误,或者 2) 缺乏对日历 API 工作原理的理解。无论哪种情况,我只想要下个月(同一天),除非某些月份和日期有问题。但是上面的场景让我感到困惑。这不会发生在一个月的任何其他日子,只会发生在 1 日。

最佳答案

这是一个时区问题。用以下内容替换您现有的设置行,以便日历和格式化程序都使用相同的时区:

    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
    formatter.setTimeZone(tz);
    Calendar cal = Calendar.getInstance(tz);

一切正常:

Current calendar time=Fri Jun 01 08:00:00 BST 2012
In loop - current calendar time=Sun Jul 01 08:00:00 BST 2012
In loop - current calendar time=Wed Aug 01 08:00:00 BST 2012
In loop - current calendar time=Sat Sep 01 08:00:00 BST 2012
In loop - current calendar time=Mon Oct 01 08:00:00 BST 2012
In loop - current calendar time=Thu Nov 01 07:00:00 GMT 2012

您可能希望将 toString() 调用替换为 formatter.format() 调用,以便输出也处于正确的时区(它可能看起来不错如果你在美国东部时间,但我在英国时区,如你所见)。

关于Java 日历不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13037636/

相关文章:

java - 从 java 使用命令提示符

java - 无法在 Java 1.8 的 Android 中使用 lambda 函数

java - "Unable to execute HTTP Request: Broken Pipe"与 Amazon EMR 上的 Hadoop/s3

python - 如何在python3上打印当前日期?

java - 如何使用 JVM 参数为 java.util.Calendar 指定 firstDayOfWeek

html - 将元素放置在具有任意宽度但定义跨度的网格布局中

Java System.out.println 打印 20 次

java - 如何计算到某个日期的剩余时间

php - 将 8 位整数转换为 dd/mm/yyyy

java - 可用于商业用途的 java.util.Calendar 子类 - 即 IslamicCalendar