如何将两个日期之间的(大)差异添加到另一个日期

时间:2014-10-11 21:32:58

标签: java date jython maximo

在Jython脚本中,我希望移动具有相同金额的日期,并更改另一个日期。所以在我的脚本中我得到两个变量: scheduledDate和scheduledDate_previous

两者都是java Date对象。我想将差异应用于另一个日期:reservationDate

问题是,如果差异很大,我会在calendar.add()函数中得到'无法转换为整数'错误。这是我的代码:

from java.util import Date
form java.util import Calendar

myDiff = int(scheduledDate.getTime() - scheduledDate_previous.getTime())

reservationCal = Calendar.getInstance()
reservationCal.setTime(reservationDate)

reservationCal.add(Calendar.MILLISECOND, myDiff)

reservationDate = reservationCal.getTime()

如果两个日期之间的差异变大,则myDiff不再是Int,而是Big Int (请注意,它也可以是负数!) 所以我试过这样的事情:

reservationCal.add(Calendar.MINUTE, int(myDiff / 60000) )

无论如何,我不需要疯狂的预备。但这并不是一直有效。 EDIT 这会导致'add():第二个arg不能被强制转换为int'-error这似乎是公平的,因为如果你有一个奇怪的区别,那么除法可能会导致浮动。所以我尝试了这个:

from java.lang import Math
reservationCal.add(Calendar.MINUTE, int(math.floor(myDiff / 60000)))

我仍然收到如下错误:

TypeError:不支持的操作符类型:'java.math.BigInterger'和'int'

奇怪的是,当我几天更改日期时,我没有收到此错误。当我改变3个月时就会发生这种情况。用户可以更改日期和时间。他们需要在几年内改变它。

由于兼容性问题,机器仍在java 32位1.6.0_25上。它使用jython 2.5.2

是否有解决方案或我是否需要不同的approuch?

2 个答案:

答案 0 :(得分:2)

我的other answer正确解决了问题中提出的直接问题。这个答案是一个奖励,是实现计算和应用经过时间的目标的另一种途径。

如果使用这些库中的任何一个,那么执行此类日期工作会更容易:

与Java捆绑在一起的旧日期时间类(java.util.Date,.Calendar,java.text.SimpleDateFormat)出了名的麻烦,令人困惑和有缺陷。避免他们。如果需要,您可以使用上面列出的库进行转换。

约达时间

下面的代码示例使用的是Joda-Time 2.5。

经过时间

您可以通过以下两种方式计算经过时间:

  • 日历样式
    月份,周数,天数等。
  • 秒表样式
    总毫秒数,就像使用正在运行的stopwatch进行衡量一样。

这两种测量经过时间的方法可能会产生不同的结果!此代码示例显示了两者。

时区

与j.u.Date不同,Joda-Time中的DateTime对象实际上知道自己指定的时区。如果按日历样式(月,日等)计算经过的时间,这一点至关重要。请注意此示例如何使用蒙特利尔,魁北克时区(任意选择)。

示例代码

// Simulate inputs, a trio of java.util.Date objects.
java.util.Date dateStart = new DateTime( 2014 , 1 , 2 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate();
java.util.Date dateStop = new DateTime( 2014 , 3 , 2 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate();
java.util.Date dateTarget = new DateTime( 2014 , 7 , 1 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate();

// Convert inputs to Joda-Time
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" ); // Or DateTimeZone.UTC.
DateTime start = new DateTime( dateStart , timeZone );
DateTime stop = new DateTime( dateStop , timeZone );
DateTime target = new DateTime( dateTarget , timeZone );

// Determine elapsed time in three fashions: (a) pair of points on timeline, (b) An amount of weeks, days, hours, and such, and (c) actual milliseconds.
Interval interval = new Interval( start , stop );
Period period = interval.toPeriod();
Duration duration = interval.toDuration();

// Add elapsed time to target date-time. Show results of adding either period or duration.
DateTime laterByPeriod = target.plus( period );
DateTime laterByDuration = target.plus( duration );

转储到控制台。

System.out.println( "dateStart: " + dateStart ); // BEWARE: j.u.Date objects are in UTC by definition, but "toString" method applies the JVM's current default time zone. Misleading!
System.out.println( "dateStop: " + dateStop );
System.out.println( "dateTarget: " + dateTarget );

System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "target: " + target );

System.out.println( "interval: " + interval );
System.out.println( "period: " + period );
System.out.println( "duration: " + duration );

System.out.println( "laterByPeriod: " + laterByPeriod );  // Notice the change in offset because of DST (Daylight Saving Time) in Québec.
System.out.println( "laterByDuration: " + laterByDuration );

跑步时。

dateStart: Wed Jan 01 16:00:00 PST 2014
dateStop: Sat Mar 01 16:00:00 PST 2014
dateTarget: Mon Jun 30 17:00:00 PDT 2014
start: 2014-01-01T19:00:00.000-05:00
stop: 2014-03-01T19:00:00.000-05:00
target: 2014-06-30T20:00:00.000-04:00
interval: 2014-01-01T19:00:00.000-05:00/2014-03-01T19:00:00.000-05:00
period: P2M
duration: PT5097600S
laterByPeriod: 2014-08-30T20:00:00.000-04:00
laterByDuration: 2014-08-28T20:00:00.000-04:00

答案 1 :(得分:0)

使用long(64位整数)而不是int(32位整数)。如Tutorial by Oracle

中所述