1

Jython スクリプトでは、別の日付が変更されたのと同じ金額で日付を移動したいと考えています。したがって、私のスクリプトでは、scheduledDate とscheduledDate_previous の 2 つの変数を取得します。

どちらも 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()

2 つの日付の差が大きくなりすぎると、myDiff は Int ではなく Big Int になります (負の数になる可能性があることに注意してください!)。

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

とにかく、その非常識な精度は必要ありません。しかし、これは常にうまくいくわけではありませんでした。編集'add(): second arg cant be coerced to an int'-error が発生します。これは、奇妙な違いがある場合、除算が float になる可能性があるため、公平に見えました。だから私はこれを試しました:

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

以下のコード例は、Joda-Time 2.5 を使用しています。

経過時間

経過時間は、次の 2 つの方法のいずれかでカウントできます。

  • カレンダースタイル
    月、週、日などの数。
  • ストップウォッチスタイル実行中のストップウォッチ
    で測定されたかのように、ミリ秒の合計数。

経過時間を測定するこれら 2 つの方法は、異なる結果をもたらす可能性があります。このコード例は両方を示しています。

タイムゾーン

juDate とは異なり、Joda DateTime-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(32ビット整数) ではなく (64 ビット整数)を使用しintます。Oracle によるチュートリアルで説明されているとおりです。

于 2014-10-12T01:09:38.140 に答える