【问题标题】:how to add a (big)difference between to dates to another date如何将两个日期之间的(大)差异添加到另一个日期
【发布时间】:2014-12-06 19:22:00
【问题描述】:

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

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

【问题讨论】:

    标签: java date jython maximo


    【解决方案1】:

    我的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
    

    【讨论】:

    • 感谢这个例子。我不能使用日期时间,因为我被困在 java 1.6 上。我不确定我是否可以安装 joda-time。不过我会检查的。
    • Joda-Time 2.x 在 Java 5、6、7 和 8 上运行。 对于 Java 4,使用 Joda-Time 1.x 继续可用,但可能未更新,因此您可能需要手动更新时区数据("Olsen database")。
    【解决方案2】:

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

    【讨论】:

    • 您好,由于兼容性问题,机器仍在使用 java 32 位 1.6.0_25。它使用 jython 2.5.2 我稍微更改了代码,问题是除法。甚至 myDiff = long(myDiff / long(60000)) 也会导致“java.math.Biginterger”和“long”的操作类型不受支持。如果我只对 myDiff 使用 long (并以毫秒为单位),我会收到如下错误:and(): second arg cant be coerced to int
    • 我怀疑您对long 原语的语法处理不当。在数字文字后使用大写 L。转换是使用括号中的类型完成的,例如(long)myIntVar。示例:long x = 789L;long y = ( x / 60000L );
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多