1

在 Jython 脚本中,我想以相同的数量移动一个日期,以更改另一个日期。所以在我的脚本中,我得到了两个变量:scheduledDate 和 scheduleDate_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) )

反正我不需要那种疯狂的预测。但这并不是一直有效。编辑它会导致'add(): second arg cant be coerced to an 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

有解决方案还是我需要不同的方法?

4

2 回答 2

2

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

如果使用以下库中的任何一个,执行此类日期时间工作会容易得多:

与 Java 捆绑在一起的旧日期时间类(java.util.Date、.Calendar、java.text.SimpleDateFormat)出了名的麻烦、混乱和缺陷。避开他们。如果需要,您可以使用上面列出的任一库来回转换。

乔达时间

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

经过时间

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

  • 日历样式
    月数、周数、天数等​​。
  • 秒表样式
    总毫秒数,就像用正在运行的秒表测量一样。

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

时区

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

示例代码

// 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
于 2014-10-12T01:54:15.830 回答
0

使用long(64 位整数)而不是int(32 位整数)。如Oracle 教程中所述。

于 2014-10-12T01:09:38.140 回答