日付に分を追加する方法


110

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

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

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



回答:


193

あなたにとっての問題は、あなたが使用していることですmm。使用する必要がありますMMMM月と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));

おかげで、私はこれを試しました、日付は正しく来ていますが、それを文字列として変更しようとすると、同じ間違った結果が返されますString newTime = df.format(afterAddingTenMins); それは私に2011-50-07 17時50を与え、私は文字列でそれを変換する必要があり、任意の提案
junaidp

1
@junaidp後者のコードを使用しましたが、ソリューションの前の部分を無視しましたか?
Carl

57

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

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

1
古いバージョンのDateUtilsを扱っている人のために、パッケージに存在する->org.apache.commons.lang.time.DateUtils
realPK

32

@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;
}

25

依存関係を回避するために、次のように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());

17

これは正しく指定されていません:

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

月(MM)ではなく分を使用している


6

tl; dr

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

java.time

日付時刻の作業には、優れたjava.timeクラスを使用してください。これらのクラスは、java.util.Dateおよびなどの厄介な古い日時クラスに取って代わりjava.util.Calendarます。

ISO 8601

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

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

LocalDateTime

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

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はタイムゾーンがないため、タイムライン上のポイントを表していませ。タイムゾーンを適用して、実際の瞬間に翻訳します。指定適切なタイムゾーン名をの形式でcontinent/regionのような、America/MontrealAfrica/Casablanca、またはPacific/Auckland、またはAsia/Karachi。など3-4文字の略語は絶対に使用しないでくださいESTか、ISTまたはPKTそのままではない真の時間帯、標準化されていない、と(!)にも固有のものではありませんが。

ZonedDateTime

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

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

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

異常

タイムゾーンを追加する10分前か後に追加するかどうかを検討してください。あなたはので、シフトなど夏時間(DST)などの異常の非常に異なる結果を得ることができ、壁時計時間を

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

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

Instant

UTCのレンズを通して見たのと同じ瞬間が必要な場合は、を抽出しInstantます。このInstantクラスは、ナノ秒の分解能(小数点以下9桁まで)でUTCのタイムライン上の瞬間を表します。

Instant instant = zdt.toInstant();

変換する

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

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

java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモード、java.timeへの移行をアドバイスします。

詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

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

  • Java SE 8および SE 9以降
    • 内蔵。
    • 実装がバンドルされた標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6および SE 7
    • java.time機能の多くは、ThreeTen-BackportでJava 6および7にバックポートされています。
  • アンドロイド
    • ThreeTenABPのプロジェクトは、適応ThreeTen、バックポート、特にAndroidのための(上記の)。
    • 使い方…をご覧ください。

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


4

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

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

4

このフォーマットを使用し、

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

分はmm、マウントはMM


2

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

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


1

私のために働く

//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)

2
この回答は、alireza alallahによって昨年投稿された回答をどのように改善しますか?また、質問は秒ではなく分に言及しました。
バジルブルク2015年

1

定数なしで実行可能(3600000 msは1時間など)

public static Date addMinutesToDate(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

public static Date addHoursToDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

使用例:

System.out.println(new Date());
System.out.println(addMinutesToDate(new Date(), 5));

Tue May 26 16:16:14 CEST 2020
Tue May 26 16:21:14 CEST 2020

1
これらの恐ろしい日時クラスは、現代で年前に取って代わられたjava.timeの JSR 310の採用のように、クラス
バジルボーク

-2

興味がある人のためだけに。私は同様の機能を必要とするiOSプロジェクトに取り組んでいたので、@ jeznagによる回答の移植を迅速に終了しました

private func addMinutesToDate(minutes: Int, beforeDate: NSDate) -> NSDate {
    var SIXTY_SECONDS = 60

    var m = (Double) (minutes * SIXTY_SECONDS)
    var c =  beforeDate.timeIntervalSince1970  + m
    var newDate = NSDate(timeIntervalSince1970: c)

    return newDate
}

Swiftの日付には、すでに似たような組み込み関数がありました。たとえば、Date(timeInterval:、since:)
Albert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.