web-dev-qa-db-ja.com

JodaTimeを使用してDateTimeまでマイナス1時間

DateTimeから1時間を減算したいのですが、Googleで調べてみたところ、日付のコピーを取り、ここで特定の期間をとるマイナスというメソッドがあることがわかりました。 http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minus(long)

しかし、使い方がわからず、インターネットで例を見つけることができません。

これが私のコードです:

String string1 = (String) table_4.getValueAt(0, 1);
    String string2= (String) table_4.getValueAt(0, 2);

    DateTimeFormatter dtf = DateTimeFormat.forPattern("hh:mm a").withLocale(Locale.ENGLISH);
    DateTime dateTime1 = dtf.parseDateTime(string1.toString());
    DateTime dateTime2 = dtf.parseDateTime(string2.toString());

    final String oldf = ("hh:mm a");
    final String newf= ("hh.mm 0");
    final String newf2= ("hh.mm a");
    final String elapsedformat = ("hh.mm");

    SimpleDateFormat format2 = new SimpleDateFormat(oldf);
    SimpleDateFormat format2E = new SimpleDateFormat(newf); 

    Period timePeriod = new Period(dateTime1, dateTime2);

    PeriodFormatter formatter = new PeriodFormatterBuilder()

     .appendHours().appendSuffix(".")
     .appendMinutes().appendSuffix("")
     .toFormatter();

    String elapsed = formatter.print(timePeriod);

    table_4.setValueAt(elapsed,0,3);

    DecimalFormat df = new DecimalFormat("00.00");
    System.out.println(dateTime1);
    table_4.setValueAt("", 0, 4);
    table_4.setValueAt("", 0, 5);

サンプルデータ:

    dateTime1: 08:00 AM
    dateTime2: 05:00 PM

期間は9時間になります。しかし、プログラムで昼休みを差し引きたいという理由だけで、8時間にしたいのです。

私はこの愚かなコードでそれを試しました:

dateTime1.minus(-1) 

また、string1を2倍に解析して、1を引くことができるようにしました。

double strindtoD = Integer.parseInt(string1);

また、別のDateTimeを作成し、期間を使用して2つの時間の差を取得してみました

String stringOneHour = ("01:00 AM");
DateTime dateTime3 = dtf.parseDateTime(stringOneHour.toString());
Period timePeriod = new Period(dateTime3, dateTime1);
15
Maguzu

使用するだけです:

dateTime.minusHours(1)

これは APIに記載されています です。

DateTimeオブジェクトは不変であるため、操作だけでは効果がないことに注意してください。このメソッドの結果を新しいオブジェクトに割り当てる(またはそれ自体を置き換える)必要があります。

dateTime = dateTime.minusHours(1);

2つのPeriodの差からDateTimeを取得する方法については、最初にIntervalを実行する必要があります。

Period period = new Interval(begin, end).toPeriod();

Link to a SO PeriodIntervalの両方がある理由を説明する投稿。

補足:JodaTimeはAPIで多くの間接化を使用しています。そのため、Javadocを読み取るには、1つのクラスのメソッドを読み取る必要があるだけでなく、継承されたすべての抽象クラス/インターフェイスから継承されたメソッドのリストも確認する必要があります。たとえば、DateTimeReadableInstantでもあります。あなたがそれに慣れている人は、しかし、それは簡単です。

39
fge

古いバージョンのorg.joda.time.DateTimeを使用している場合は、次のようなminus(ReadablePeriod period)メソッドを使用できます。

        Date date = LocalDate.now().minus(new Period(1, 0, 0, 0)).toDate();

ここで、Periodはint時間、int分、int秒、intミリ秒のパラメーターを受け入れます。

0
Lance Reid