java - 如何在 Java 中移动日历?

标签 java datetime gregorian-calendar

我正在尝试编写一个 Java 方法来移动日历,使用以毫秒为单位的时间偏移量。 但是当我尝试轮类一个月(30 天)时,它不起作用:

Calendar c = new GregorianCalendar(2012, 5, 23, 13, 23, 10);
long original = c.getTimeInMillis();
System.out.println("Original Date "+c.getTime());

long oneMonth = 30*24*60*60*1000;   //one month in milliseconds
Calendar c_1Month = new GregorianCalendar();
c_1Month.setTimeInMillis(original+oneMonth);
System.out.println("After 1-month "+c_1Month.getTime());

输出为

Original Date Sat Jun 23 13:23:10 PDT 2012
After 1-month Sun Jun 03 20:20:22 PDT 2012

您可以看到它没有正确地将其转移到 7 月 23 日。 我知道日历中有一种特定的方法添加(字段,金额),我可以使用它来更改月份,但我想在我的客户端中使用一种方法来转移时间,并提供以毫秒为单位的转移量(转移量的变化基于在我的测试中,我不想有几种方法)。

最佳答案

您认为变量 oneMonth 是一个 long,但您为其分配了一个整数值。但 30*24*60*60*1000 的结果不适合整数,因此会溢出为负值。

如果您将代码更改为 long oneMonth = 30*24*60*60*1000L; 它将起作用。

但是尽管你的代码中有这个“bug”,comment azurefrog 的说法是正确的,这不是添加 1 个月的推荐方法,只有在您想添加 30 天(这是不同的情况)时才有效。

尝试使用这样的东西:

c_1Month.add( Calendar.DAY_OF_MONTH, 30);

c_1Month.add( Calendar.MONTH, 1);

Calendar 类能够感知并能够很好地处理所有极端情况。我建议你依靠这个。它减少了可能的错误并使代码更易于阅读和理解。

对于 Java 8,要使用的代码是:

LocalDateTime.now().plusMonths(1);

LocalDateTime.now().plusDays(30);

关于java - 如何在 Java 中移动日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24316799/

相关文章:

java - 如何使用 firebase 监听 android studio 中的变化

Python - 两个日期时间之间的数据子集

c# - LINQ 分组依据然后显示 (dd mmm) 的日期时间

c# - 如何将格式为月/日/年时间的字符串化日期值转换为日期时间?

Java:GregorianCalendar 返回错误的数据

java - 从文件获取输入

java - 如何用给定字符串中的 ""替换给定子字符串?

java - 打包成JAR后编译报告时出错

java - 自纪元以来时间不稳定的公历日历

java - 有没有办法在 Java 中向 GregorianCalendar 添加方法?