web-dev-qa-db-ja.com

日付に分を追加する方法

私はこの日付オブジェクトを持っています:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());

d1の値はFri Jan 07 17:40:00 PKT 2011

現在、上記の日付に10分を追加しようとしています。

Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());

newTimeの値は2011-50-07 17:50に変わりますが、07-01-2011 17:50でなければなりません。

分を正しく追加しますが、月も変わります。理由はわかりません!

94
junaidp

問題は、mmを使用していることです。 MMを使用する必要があります。 MMは月、mmは分を表します。 yyyy-MM-dd HH:mmで試してください

その他のアプローチ:

これと同じくらい簡単にできます(他のオプションは joda-time を使用することです)

static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs

Calendar date = Calendar.getInstance();
long t= date.getTimeInMillis();
Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS));
179

org.Apache.commons.lang3.timeパッケージのDateUtilsクラスを使用できます

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
42
Alireza Alallah

@Pangeaの答えを実装するための便利な方法:

/*
*  Convenience method to add a specified number of minutes to a Date object
*  From: http://stackoverflow.com/questions/9043981/how-to-add-minutes-to-my-date
*  @param  minutes  The number of minutes to add
*  @param  beforeTime  The time that will have minutes added to it
*  @return  A date object with the specified number of minutes added to it 
*/
private static Date addMinutesToDate(int minutes, Date beforeTime){
    final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs

    long curTimeInMs = beforeTime.getTime();
    Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS));
    return afterAddingMins;
}
32
jeznag

これは間違って指定されています:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");

月の代わりに分を使用しています(MM)

16
Dawood

依存関係を回避するために、次のようにJava.util.Calendarを使用できます。

    Calendar now = Calendar.getInstance();
    now.add(Calendar.MINUTE, 10);
    Date teenMinutesFromNow = now.getTime();

Java 8には新しいAPIがあります:

    LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES));
    Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
16
Marco Montel

tl; dr

LocalDateTime.parse( 
    "2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )

Java.time

日時の作業に優れたJava.timeクラスを使用します。これらのクラスは、Java.util.DateJava.util.Calendarなどの厄介な古い日時クラスに取って代わります。

ISO 8601

Java.timeクラスは、日付/時刻値の文字列を解析/生成するために、デフォルトで標準の ISO 8601 形式を使用します。入力文字列を準拠させるには、中央のSPACEをTに置き換えます。

String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );

LocalDateTime

タイムゾーンまたはUTCからのオフセットに関する情報がないため、入力文字列をLocalDateTimeとして解析します。

LocalDateTime ldt = LocalDateTime.parse( inputModified );

10分追加します。

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

ldt.toString():2016-01-23T12:34

ldtLater.toString():2016-01-23T12:44

IdeOne.comのライブコード を参照してください。

LocalDateTimeにはタイムゾーンがないため、notはタイムライン上のポイントを表します。タイムゾーンを適用して、実際の瞬間に変換します。 適切なタイムゾーン名continent/regionの形式で指定します。たとえば、 America/MontrealAfrica/CasablancaPacific/Auckland、または Asia/Karachi =。 ESTIST、またはPKTなどの3〜4文字の略語を使用しないでください。not真のタイムゾーンであり、標準化されておらず、一意でもありません(!)。

ZonedDateTime

この値の目的のタイムゾーンがわかっている場合は、ZoneIdを適用してZonedDateTimeを取得します。

ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString():2016-01-23T12:44 + 05:00 [アジア/カラチ]

異常

タイムゾーンを追加する前に10分追加するか、追加するかを検討します。 wall-clock time をシフトする夏時間(DST)などの異常により、非常に異なる結果が得られる場合があります。

ゾーンを追加する前または後に10分間を追加するかどうかは、ビジネスシナリオとルールの意味によって異なります。

ヒント:タイムライン上の特定の瞬間を意図している場合、常にタイムゾーン情報を保持します。入力データと同様に、その情報を失わないでください。値12:34は、パキスタンで正午、フランスで正午、またはケベックで正午ですか?パキスタンで正午を意味する場合は、少なくともUTCからのオフセット(+05:00)、さらにはタイムゾーンの名前(Asia/Karachi)を含めることでそう言います。

Instant

UTC のレンズを通して見たのと同じ瞬間が必要な場合は、Instantを抽出します。 Instant クラスは UTC のタイムライン上の瞬間を表します nanoseconds (10進数の最大9桁)分数)。

Instant instant = zdt.toInstant();

変換する

面倒な古い日時クラスは可能な限り避けてください。ただし、必要な場合は変換できます。古いクラスに追加された新しいメソッドを呼び出します。

Java.util.Date utilDate = Java.util.Date.from( instant );

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラスに取って代わります。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、Java.timeへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 実装がバンドルされた標準Java AP​​Iの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。 。
  • Android
    • ThreeTenABP プロジェクトが適応-ThreeTen-Backport(上記)Android具体的に。
    • 使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

5
Basil Bourque

SimpleDateFormatのパターンにエラーがあります。そのはず

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
4
Baldrick

この形式を使用し、

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

mmは分、MMは月

4
Kushan

日付を解析したら、このユーティリティ関数を使用して、時間、分、または秒を追加します。

public class DateTimeUtils {
    private static final long ONE_HOUR_IN_MS = 3600000;
    private static final long ONE_MIN_IN_MS = 60000;
    private static final long ONE_SEC_IN_MS = 1000;

    public static Date sumTimeToDate(Date date, int hours, int mins, int secs) {
        long hoursToAddInMs = hours * ONE_HOUR_IN_MS;
        long minsToAddInMs = mins * ONE_MIN_IN_MS;
        long secsToAddInMs = secs * ONE_SEC_IN_MS;
        return new Date(date.getTime() + hoursToAddInMs + minsToAddInMs + secsToAddInMs);
    }
}

長い期間を追加するときは注意してください。1日は常に24時間ではありません(夏時間の調整、うるう秒など)。そのためには Calendar をお勧めします。

2
David Miguel

私のために働く

//import
import org.Apache.commons.lang.time.DateUtils

...

        //Added and removed minutes to increase current range dates
        Date horaInicialCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaInicial.getTime()),-1)
        Date horaFinalCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaFinal.getTime()),1)
0
Samuel Ivan