java日历/格式提供错误的日期

Posted

技术标签:

【中文标题】java日历/格式提供错误的日期【英文标题】:java Calender/formatter provides wrong date 【发布时间】:2011-07-10 07:18:53 【问题描述】:

不知何故,我被报告了一个问题,其中以下代码提供了未来的日期。

使用的时区是 GMT+01:00。 numberOfDays 是非负整数。

此代码的目的是减少当前日期的天数。

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yy",Locale.ENGLISH);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -numberOfDays);
Date date = calendar.getTime();
String dateStr= formatter.format(date);
System.out.println("Date : "+dateStr);

我无法在我的机器上重现此内容。

语言环境会影响时区吗?

我试图与Why does a new SimpleDateFormat object contain calendar with the wrong year? 和Strange problem with timezone, calendar and SimpleDateFormat 相关联,但徒劳无功。

请帮助我理解并纠正这个问题。

【问题讨论】:

实际上为我工作(为我打印Date : 25 Feb 11;我在格林威治标准时间)。您的系统在哪个时区? 只是为了澄清:您可以在哪里重现问题?还是您刚刚收到一份未经证实的报告? 也许应该是 DAY_OF_YEAR 而不是 DAY_OF_MONTH ? @adarshr:对我也有用,我已将系统时区更改为 GMT+1.00 @Martin:谢谢,但除非我证明有必要,否则我没有权限更改实现。 @Joachim Sauer:我仍然无法重现问题 【参考方案1】:

嗯,我能想到两种可能性:

客户端计算机上的系统日期不正确,因此日历以未来的日期开始 如果numberOfDays为负数,显然会将日期推到未来

Locale 与时区没有直接关系——它们是独立的,尽管显然具有法国语言环境的机器可能在法国时区等。

就我个人而言,我会完全避免使用日期/日历并使用Joda Time 作为一个更好的日期和时间 API,但这对我上面给出的任何一个想法都没有帮助......

【讨论】:

感谢您的回复。据了解,日期设置正确,numberOfDays 为非负整数。如果不提供错误原因,我无法真正更改实现,因此无法使用 Joda Time。 @Nilesh:您能否打印出调用add(以及numberOfDays 的值)之前 的日期以用于诊断目的?您与有问题的人的关系如何? 我可以在本地机器上看到add之前的正确日期; numberOfDays 也不是负数,有这个问题的客户是遥不可及的,我没有任何信息/访问发生这种情况的地方。 @Nilesh:恐怕这就是你需要获取信息的地方。 numberOfDays 是肯定的并且日期在您无法重现问题的机器上是正确的,我并不感到惊讶 :)

以上是关于java日历/格式提供错误的日期的主要内容,如果未能解决你的问题,请参考以下文章

swift中的日期格式错误

第二轮冲刺-Runner站立会议04

求帮忙写个程序 JAVA C++都行

Day640.Java 8的日期时间类问题 -Java业务开发常见错误

Tapku 日历上标记的日期错误

当值设置为超过最大日期时,Kendo Datepicker 显示错误的格式