Javaの値で日付オブジェクトを作成する方法


91

日付2014-02-11の日付オブジェクトが必要です。このように直接作成することはできませんが、

Date myDate = new Date(2014, 02, 11);

だから私は次のようにやっています、

Calendar myCalendar = new GregorianCalendar(2014, 2, 11);
Date myDate = myCalendar.getTime();

Javaで日付オブジェクトを作成する簡単な方法はありますか?


7
あなたのアプローチで簡単ではないことは何ですか?
giorashc 2014年

3
「簡単な方法はありますか」。それがそれほど簡単ではないと思う理由は何ですか?時間と日付はあなたが思っているよりもはるかに複雑です。複数のカレンダーと複数のタイムゾーンがあります。
レドワルド2014年

5
のような一行Date myDate = new GregorianCalendar(2014, 2, 11).getTime();
エリオットフリッシュ2014年

2
この質問に見られるように、整数リテラルで先行ゼロを使用することに注意してください02。Javaでは、これは10進数(基数10)ではなく8進数(基数8)を意味します。
バジルバーク2015年

2
以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeのJavaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルバーク2018

回答:


108

落とし穴:月として2を渡すと、予期しない結果が生じる可能性があります。CalendarAPIでは、月はゼロベースです。2は実際には3月を意味します。

カレンダーの使い方はもう十分簡単だと思うので、あなたが探している「簡単な」方法が何であるかわかりません。

月には正しい定数を使用することを忘れないでください。

 Date date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime();

別の方法は、DateFormatを利用することです。これは、通常、次のようなユーティリティを使用しています。

 public static Date parseDate(String date) {
     try {
         return new SimpleDateFormat("yyyy-MM-dd").parse(date);
     } catch (ParseException e) {
         return null;
     }
  }

簡単に書けるように

Date myDate = parseDate("2014-02-14");

私が好むさらに別の選択肢:Java Date / Calendarをもう使用しないでください。JODATimeまたはJavaTime(別名JSR310、JDK 8以降で使用可能)に切り替えます。LocalDate日付を表すために使用できます。これは、次の方法で簡単に作成できます。

LocalDate myDate =LocalDate.parse("2014-02-14");
// or
LocalDate myDate2 = new LocalDate(2014, 2, 14);
// or, in JDK 8+ Time
LocalDate myDate3 = LocalDate.of(2014, 2, 14);

1
.toTime()存在しません。それはする必要があります.getTime()(参照Javaのドキュメントを
0xJoKe

タイプミスでごめんなさい。OPは:Pを呼び出す正しい方法をすでに知っていると思いますが
Adrian Shum 2015年

あなたが正しいことをかなり確信しています。しかし、それが必要になるたびにそれを調べなければならない(私のような)人々にとって、それは迷惑です。修正していただきありがとうございます:)
0xJoKe 2015

1
return new SimpleDateFormat("yyyy-mm-dd").parse(date) あるべきreturn new SimpleDateFormat("yyyy-MM-dd").parse(date)
aks 2016

良いキャッチ。なぜ私がそのような間違いをしたのかわからない。修正
Adrian Shum 2016

34

tl; dr

LocalDate.of( 2014 , 2 , 11 )

ひどい古いjava.util.Dateクラスを使用することを主張する場合は、最新のjava.timeクラスから変換してください

java.util.Date                        // Terrible old legacy class, avoid using. Represents a moment in UTC. 
.from(                                // New conversion method added to old classes for converting between legacy classes and modern classes.
    LocalDate                         // Represents a date-only value, without time-of-day and without time zone.
    .of( 2014 , 2 , 11 )              // Specify year-month-day. Notice sane counting, unlike legacy classes: 2014 means year 2014, 1-12 for Jan-Dec.
    .atStartOfDay(                    // Let java.time determine first moment of the day. May *not* start at 00:00:00 because of anomalies such as Daylight Saving Time (DST).
        ZoneId.of( "Africa/Tunis" )   // Specify time zone as `Continent/Region`, never the 3-4 letter pseudo-zones like `PST`, `EST`, or `IST`. 
    )                                 // Returns a `ZonedDateTime`.
    .toInstant()                      // Adjust from zone to UTC. Returns a `Instant` object, always in UTC by definition.
)                                     // Returns a legacy `java.util.Date` object. Beware of possible data-loss as any microseconds or nanoseconds in the `Instant` are truncated to milliseconds in this `Date` object.   

詳細

「簡単」にしたい場合は、Javaにバンドルされている悪名高いjava.util.Dateクラスと.Calendarクラスではなく、Java8の新しいjava.timeパッケージを使用する必要があります。

java.time

java.timeの後にJavaの8に組み込まれており、フレームワークが面倒古いjava.util.Date/.Calendarクラスに取って代わります。

日付のみ

ここに画像の説明を入力してください

LocalDateクラスは、任意の時刻またはタイムゾーンのない日付のみの値を表すためにjava.timeによって提供されています。たとえば、パリではモントリオールよりも早く新しい日が始まるため、日付を決定するためのタイムゾーンが必要です。ZoneIdクラスは、タイムゾーンのためです。

ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );

コンソールにダンプ:

System.out.println ( "today: " + today + " in zone: " + zoneId );

今日:2015-11-26ゾーン:アジア/シンガポール

または、ファクトリメソッドを使用して、年、月、日を指定します。

LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );

localDate:2014-02-11

または、DayOfWeek列挙型オブジェクトではなく、月番号1〜12を渡します。

LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );

タイムゾーン

ここに画像の説明を入力してください

ALocalDateは、タイムゾーンに調整するまで実際の意味はありません。java.timeでは、タイムゾーンを適用してZonedDateTimeオブジェクトを生成します。それは時刻も意味しますが、何時ですか?通常、その日の最初の瞬間に行くのは理にかなっています。それは時間を意味すると思うかもしれませんが00:00:00.000、夏時間(DST)やその他の異常のために、常に正しいとは限りません。その時間を想定する代わりに、java.timeに、を呼び出してその日の最初の瞬間を判別するように依頼しますatStartOfDay

指定適切なタイムゾーン名をの形式でcontinent/region、のようなAmerica/MontrealAfrica/CasablancaまたはPacific/Auckland。決してなど3-4文字の略称を使用していないESTか、ISTそのままではない真の時間帯ではなく、標準化、さらには一意ではありません(!)。

ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );

zdt:2014-02-11T00:00 + 08:00 [アジア/シンガポール]

UTC

ここに画像の説明を入力してください

バックエンド作業(ビジネスロジック、データベース、データストレージ、交換)には、通常UTCタイムゾーンを使用します。java.timeでは、InstantクラスはUTCのタイムライン上の瞬間を表します。Instantオブジェクトは、を呼び出すことでZonedDateTimeから抽出できますtoInstant

Instant instant = zdt.toInstant();

インスタント:2014-02-10T16:00:00Z

変換

java.util.Dateクラスを完全に使用することは避けてください。ただし、java.time用にまだ更新されていない古いコードと相互運用する必要がある場合は、前後に変換できます。古いクラスに追加された新しい変換メソッドを探してください。

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

…そして…

Instant instant = d.toInstant() ;

最新およびレガシーの両方のJavaのすべての日時タイプの表


java.timeについて

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

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

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

java.timeオブジェクトをデータベースと直接交換できます。JDBC4.2以降に準拠したJDBCドライバーを使用してください。文字列もクラスも必要ありません。Hibernate5およびJPA2.2はjava.timeをサポートしますjava.sql.*

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


更新:Joda -Timeライブラリはメンテナンスモードになり、java.timeクラスへの移行をアドバイスします。私はこのセクションを歴史のために残しておきます。

ジョーダタイム

一つには、Joda-Timeは賢明な番号付けを使用しているため、2月はそうではあり2ません1。もう1つ、Joda-Time DateTimeは、タイムゾーンがあるように見えるが、持っていないjava.util.Dateとは異なり、割り当てられたタイムゾーンを本当に知っています。

そして、タイムゾーンを忘れないでください。それ以外の場合は、JVMのデフォルトを取得します。

DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );

java.util.Locale locale = new java.util.Locale( "ms", "SG" ); // Language: Bahasa Melayu (?). Country: Singapore.
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );

コンソールにダンプ…

System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );

実行すると…

dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT

変換

他のクラスで使用するためにjava.util.Dateに変換する必要がある場合…

java.util.Date date = dateTimeSingapore.toDate();

4
たった1つのコメント。のようなフィールドでゼロの前に付ける練習new DateTime( 2014, 02, 11, 0, 0, timeZone );は、おそらく好ましくありません。この場合は機能しますが、パス0809ている場合は8月と9月にはコンパイルされず、intリテラルの前に0を付けると、8進数で表示されます。それは、何年も前に予期しない値を与えることさえあります1000。たとえばnew DateTime( 0100, 02, 01, 0, 0, timeZone );、100ADであると予想されるかもしれませんが、実際には64ADです
Adrian Shum

@AdrianShum Yikes!整数リテラルの先行ゼロのような無実の小さなタイプミスがそのような厄介な副作用をもたらす可能性があることを私は知りませんでした。ありがとう。
バジルバーク2015

2
親愛なるダウン投票者、あなたの投票と一緒に批判を残してください。
バジルバーク2017

「ひどい古いjava.util.Dateクラスの使用を主張する場合」。私は新しいものを使用するlooveでしょうが、多くのプロバイダは、そう、JDK7を超えてJavaを実行するサーバーのTomcat提供していない、いくつかは.....ため、他の古いたわごとで立ち往生している
KimvdLinde

@KimvdLinde私の答えをもっと注意深く読み直してください。弾丸を見てください。「JavaSE6およびJavaSE7」という単語を見つけます。
バジルバーク

14

最善の方法はSimpleDateFormatオブジェクトを使用することだと思います。

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2014-02-11";
Date dateObject = sdf.parse(dateString); // Handle the ParseException here

Y ..そして、YYYYを絶対に使用しないでください-yyyyを使用してください-特にこれを解析ではなくフォーマットで逆に行う場合は。あなたはいくつかの奇妙な結果を得る!!! ここを参照してください:code.sololearn.com/c0EYUAOc92uQ/#java
JGFMK

9

Java8から:

import java.time.Instant;
import java.util.Date;

Date date = Date.from(Instant.parse("2000-01-01T00:00:00.000Z"))

2

これを試して

 Calendar cal = Calendar.getInstance();
    Date todayDate = new Date();
    cal.setTime(todayDate);

    // Set time fields to zero
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    todayDate = cal.getTime();

1
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.ENGLISH);
//format as u want

try {
    String dateStart = "June 14 2018 16:02:37";
    cal.setTime(sdf.parse(dateStart));
    //all done
} catch (ParseException e) {
    e.printStackTrace();
}

ひどいクラスCalendarSimpleDateFormatクラスは、年も前にjava.timeクラスに取って代わられました。2018年にそれらの使用を提案することは悪いアドバイスです。
バジルバーク2018

この回答は、この質問の詳細には対応していません。
バジルバーク2018

1
「APIレベル」とは、Androidを意味すると思います。しかし、これはAndroid固有の質問ではありません。さらに、ほとんどのjava.time機能は、ThreeTen-BackportプロジェクトでJava6および7にバックポートされています。ThreeTenABPプロジェクトでAndroidにさらに適合。したがって、これらのひどいレガシー日時クラスを使用する必要はありません。java.timeのクラスは根本的に優れています。
バジルバーク2018

このコメントをありがとう。このライブラリは、日付の違いや時間の違いのような機能を提供しますか?
Syed Danish Haider 2018

1
はい。このトピックに関する多くの既存のQ&Aについては、StackOverflowを検索してください。また、ThreeTen-Extraプロジェクトも参照してください(初期のAndroidにはバックポートされていません)。
バジルバーク2018

0

最も簡単な方法:

Date date = Date.valueOf("2000-1-1");
LocalDate localdate = LocalDate.of(2000,1,1);
LocalDateTime localDateTime = LocalDateTime.of(2000,1,1,0,0);

java.sql.Date使用しているクラスは設計が不十分で古くなっているため、最初のクラスは避ける必要があります。LocalDate2行目のように使用することをお勧めします。私の習慣はLocalDate.of(2000, Month.JANUARY, 1)、読むのが少しはっきりしていると思います。
Ole VV

回答にはLocalDate宣言が含まれているため、Dateオブジェクトを要求しただけではありません(非推奨ではなく、時々使用されます)...
Adam Silenko

-1
import java.io.*;
import java.util.*;
import java.util.HashMap;

public class Solution 
{

    public static void main(String[] args)
    {
        HashMap<Integer,String> hm = new HashMap<Integer,String>();
        hm.put(1,"SUNDAY");
        hm.put(2,"MONDAY");
        hm.put(3,"TUESDAY");
        hm.put(4,"WEDNESDAY");
        hm.put(5,"THURSDAY");
        hm.put(6,"FRIDAY");
        hm.put(7,"SATURDAY");
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        String format = year + "/" + month + "/" + day;
        Date date = null;
        try
        {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
            date = formatter.parse(format);
        }
        catch(Exception e){
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(hm.get(dayOfWeek));
    }
}

SimpleDateFormatフォーマッターは、私たちに従って日付をフォーマットするために使用できます。次に、Dateオブジェクト内で解析します。上記のプログラムは、任意の日付を指定して平日を取得する方法を示しています。
Ankush 2017年

-5

あなたの日付はphpから来て、html(dom)に書かれていると思いますか?すべての日付とタイムスタンプを準備するphp関数があります。これにより、必要なフォーメーションが返されます。

$timeForJS = timeop($datetimeFromDatabase['payedon'], 'js', 'local'); // save 10/12/2016 09:20 on var

この形式をjsで使用して、新しい日付を作成できます。

<html>
   <span id="test" data-date="<?php echo $timeForJS; ?>"></span>
   <script>var myDate = new Date( $('#test').attr('data-date') );</script>
</html>

私が言うことは、あなた自身の機能をラップすることで、あなたの人生をより簡単にすることです。私のfuncをサンプルとして使用できますが、私のcmsに含まれているため、1対1でコピーして貼り付けることはできません:)

    function timeop($utcTime, $for, $tz_output = 'system')
{
    // echo "<br>Current time ( UTC ): ".$wwm->timeop('now', 'db', 'system');
    // echo "<br>Current time (USER): ".$wwm->timeop('now', 'db', 'local');
    // echo "<br>Current time (USER): ".$wwm->timeop('now', 'D d M Y H:i:s', 'local');
    // echo "<br>Current time with user lang (USER): ".$wwm->timeop('now', 'datetimes', 'local');

    // echo '<br><br>Calculator test is users timezone difference != 0! Tested with "2014-06-27 07:46:09"<br>';
    // echo "<br>Old time (USER -> UTC): ".$wwm->timeop('2014-06-27 07:46:09', 'db', 'system');
    // echo "<br>Old time (UTC -> USER): ".$wwm->timeop('2014-06-27 07:46:09', 'db', 'local');

    /** -- */
    // echo '<br><br>a Time from db if same with user time?<br>';
    // echo "<br>db-time (2019-06-27 07:46:09) time left = ".$wwm->timeleft('2019-06-27 07:46:09', 'max');
    // echo "<br>db-time (2014-06-27 07:46:09) time left = ".$wwm->timeleft('2014-06-27 07:46:09', 'max', 'txt');

    /** -- */
    // echo '<br><br>Calculator test with other formats<br>';
    // echo "<br>2014/06/27 07:46:09: ".$wwm->ntimeop('2014/06/27 07:46:09', 'db', 'system');

    switch($tz_output){
        case 'system':
            $tz = 'UTC';
            break;

        case 'local':
            $tz = $_SESSION['wwm']['sett']['tz'];
            break;

        default:
            $tz = $tz_output;
            break;
    }

    $date = new DateTime($utcTime,  new DateTimeZone($tz));

    if( $tz != 'UTC' ) // Only time converted into different time zone
    {
        // now check at first the difference in seconds
        $offset = $this->tz_offset($tz);
        if( $offset != 0 ){
            $calc = ( $offset >= 0  ) ? 'add' : 'sub';
            // $calc = ( ($_SESSION['wwm']['sett']['tzdiff'] >= 0 AND $tz_output == 'user') OR ($_SESSION['wwm']['sett']['tzdiff'] <= 0 AND $tz_output == 'local') ) ? 'sub' : 'add';
            $offset = ['math' => $calc, 'diff' => abs($offset)];
            $date->$offset['math']( new DateInterval('PT'.$offset['diff'].'S') ); // php >= 5.3 use add() or sub()
        }
    }

    // create a individual output
    switch( $for ){
        case 'js':
            $format = 'm/d/Y H:i'; // Timepicker use only this format m/d/Y H:i without seconds // Sett automatical seconds default to 00
            break;
        case 'js:s':
            $format = 'm/d/Y H:i:s'; // Timepicker use only this format m/d/Y H:i:s with Seconds
            break;
        case 'db':
            $format = 'Y-m-d H:i:s'; // Database use only this format Y-m-d H:i:s
            break;
        case 'date':
        case 'datetime':
        case 'datetimes':
            $format = wwmSystem::$languages[$_SESSION['wwm']['sett']['isolang']][$for.'_format']; // language spezific output
            break;
        default:
            $format = $for;
            break;
    }

    $output = $date->format( $format );

    /** Replacement
     * 
     * D = day short name
     * l = day long name
     * F = month long name
     * M = month short name
     */
    $output = str_replace([
        $date->format('D'),
        $date->format('l'),
        $date->format('F'),
        $date->format('M')
    ],[
        $this->trans('date', $date->format('D')),
        $this->trans('date', $date->format('l')),
        $this->trans('date', $date->format('F')),
        $this->trans('date', $date->format('M'))
    ], $output);

    return $output; // $output->getTimestamp();
}

2
2年以上前のJavaの質問にPHPで答えるのはなぜですか?
アラン・ヘイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.