web-dev-qa-db-ja.com

現在の日時を取得する方法– date()およびcalender()

現在の日付から開始して2016年10月10日の終わりになる時間と分が欲しい

package com.mkyong.date;

import Java.text.SimpleDateFormat;
import Java.util.Date;

public class DateDifferentExample
{
    public static void main(String[] args)
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        //get current date time with Date()
        Date date = new Date();
        System.out.println(dateFormat.format(date));
        //get current date time with Calendar()
        Calendar cal = Calendar.getInstance();
        System.out.println(dateFormat.format(cal.getTime()));
        String dateStart = "01/14/2012 09:29:58";
        String dateStop = "01/15/2012 10:31:48";
        //HH converts hour in 24 hours format (0-23), day calculation
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date d1 = null;
        Date d2 = null;
        try
        {
            d1 = format.parse(dateStart);
            d2 = format.parse(dateStop);
            //in milliseconds
            long diff = d2.getTime() - d1.getTime();
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

結果 :

2016/08/15 18:54:03
2016/08/15 18:54:03
1097 Days1 Hours 1 Minute 50 Second 
My want to result for example :
100 days 5 hours 2 minutes 
5
Yavuz

古い日時クラスを避ける

Javaの最も古いバージョンにバンドルされている厄介な古いレガシー日時クラスを使用しています。代わりにJava.timeクラスを使用してください。

解析中

入力文字列は、ほぼ標準のISO8601形式です。中央のスペースをTに置き換えます。 Java.timeクラスは、デフォルトでISO8601形式を使用して文字列を解析/生成します。したがって、フォーマットパターンを指定する必要はありません。

String startInput = "01/14/2012 09:29:58".replace( " " , "T" );
String stopInput = "01/15/2012 10:31:48".replace( " " , "T" );

LocalDateTime

入力には、UTCからのオフセットまたはタイムゾーンに関する情報がありません。したがって、LocalDateTimeオブジェクトとして解析します。

LocalDateTime startLdt = LocalDateTime.parse( startInput );
LocalDateTime stopLdt = LocalDateTime.parse( stopInput );

これらのタイプをさらに処理すると、夏時間(DST)などの異常を無視して、一般的な24時間の日に基づいた結果が得られます。

このデータのコンテキストが特定のタイムゾーンであることがわかっている場合は、ゾーンを適用してZonedDateTimeを取得します。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime start = startLdt.atZone( zoneId );
ZonedDateTime stop = stopLdt.atZone( zoneId );

現在の瞬間を開始または停止にしたい場合は、nowを呼び出します。 JVMの現在のデフォルトのタイムゾーンに依存するのではなく、目的の/予想されるタイムゾーンを渡します。

ZonedDateTime now = ZonedDateTime.now( zoneId );

期間

Duration クラスは、時間のスパンを合計秒数に加えて、ナノ秒単位の秒単位で表します。

Duration duration = Duration.between( start , stop );

奇妙なことに、Java 8では、このクラスには、この期間を構成する日数、時間などを取得するメソッドがありません。Java 9 to…Partメソッドを追加します

long days = duration.toDaysPart();
int hours = duration.toHoursPart();
int minutes = duration.toMinutesPart();

Java 9までは、自分で計算を行うことができます。

Java.timeについて

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

Joda-Time プロジェクトは現在 maintenance mode であり、Java.timeへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。そして、StackOverflowで多くの例と説明を検索してください。

Java.time機能の多くはJava 6&7 in ThreeTen-Backport にバックポートされ、さらに Android in-に適合されます) ThreeTenABP

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

3
Basil Bourque

public final void set(int year、int month、int date)-Calendarクラスのこのメソッドを使用して日付を設定できます。

public final void set(int year、int month、int date、int hourOfDay、int minutes、int second)時間の設定にも使用できます。

Calendar.getInstance()デフォルトで現在の日付と時刻を設定します。`

1
Sumit Gupta