java.util.DateをStringに変換する


407

java.util.DateオブジェクトをStringJavaでに変換したい。

フォーマットは 2010-05-30 22:15:52



@harschware FYI、Joda -Timeプロジェクトがメンテナンスモードになりました。チームはjava.timeクラスへの移行をアドバイスしてます。Oracleによるチュートリアルを参照してください。
バジルブルク

1
Date2019 は使用しないことをお勧めします。そのクラスは設計が不十分で、古くなっています。代わりにInstantjava.timeのまたは別のクラスを使用してください。これは、最新のJava日時APIです。
Ole VV

回答:


757

メソッドを使用して日付文字列に変換しDateFormat#formatます。

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

http://www.kodejava.org/examples/86.htmlから


25
なぜCalendarプレーンの代わりに使用するのnew Date()ですか?違いはありますか?
Alexander Malakhov 2013

10
注意:SimpleDateFormatはスレッドセーフではありません。stackoverflow.com/questions/6840803/...
ZAGS

23
Calendarは抽象クラスで、Dateは具象です。Dateは、TimeZone、Locale、または私たちがすべて使用することのない優れた機能について何も知りません。
nckbrz 14年

30
MM/dd/yyyyフォーマットは愚かで壊れています。使用しないでください。常にdd/MM/yyyyまたはを使用してくださいyyyy-MM-dd
SystemParadox

13
@SystemParadox-それは愚かですが、それはそれが無意味になるわけではありません。それは人々がレポートに期待するものと一致するので、それを使用するように特に求められました。(私はyyyy-MM-ddどこでも好きですが、あなたは何ができますか?)
Autumn Leonard、


63

Commons-lang DateFormatUtilsには多くの利点があります(クラスパスにcommons-langがある場合)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

追加のnullチェックが必要です。
Farrukh Chishti

23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

現代の方法は、厄介な古いレガシー日時クラスに取って代わるjava.timeクラスを使用する方法です。

まず、あなたを変換java.util.DateしますInstant。このInstantクラスは、ナノ秒の分解能(小数点以下9桁まで)でUTCのタイムライン上の瞬間を表します。

java.timeとの間の変換は、古いクラスに追加された新しいメソッドによって実行されます。

Instant instant = myUtilDate.toInstant();

どちらもあなたjava.util.Datejava.time.InstantしているUTC。日付と時刻をUTCで表示したい場合は、そうしてください。toString標準のISO 8601形式で文字列を生成するために呼び出します。

String output = instant.toString();  

2014-11-14T14:05:09Z

その他の形式の場合はInstant、より柔軟な形式に変換する必要がありますOffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString():2020-05-01T21:25:35.957Z

IdeOne.comコードがライブで実行されることを確認してください

目的の形式の文字列を取得するには、を指定しますDateTimeFormatter。カスタム形式を指定できます。しかし、私は事前定義されたフォーマッタ(ISO_LOCAL_DATE_TIME)の1つを使用しT、その出力のをSPACEに置き換えます。

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

ちなみに、UTCからオフセットやタイムゾーン情報を意図的に失うようなこの形式のフォーマットはお勧めしません。その文字列の日時値の意味についてあいまいさを作り出します。

また、日付時刻値の文字列表現で小数秒は無視される(事実上切り捨てられる)ため、データ損失にも注意してください。

特定の地域の実時間のレンズを通して同じ瞬間を見るには、を適用してZoneIdを取得しZonedDateTimeます。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString():2014-11-14T14:05:09-05:00 [アメリカ/モントリオール]

フォーマットされた文字列を生成するには、上記と同じことをodt行いzdtますが、に置き換えます。

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

このコードを非常に多く実行する場合は、もう少し効率的になり、への呼び出しを避けたい場合がありますString::replace。その呼び出しを削除すると、コードも短くなります。必要に応じて、独自のDateTimeFormatterオブジェクトで独自のフォーマットパターンを指定します。このインスタンスを定数またはメンバーとしてキャッシュして再利用します。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

インスタンスを渡して、そのフォーマッターを適用します。

String output = zdt.format( f );

java.timeについて

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

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

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

java.time機能の多くは、ThreeTen -BackportでJava 6&7にバックポートされ、さらにThreeTenABPでAndroidに適合します使用方法を参照)。

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


ここではJavaの8時間APIでフォーマットのコード例は以下のとおりです。stackoverflow.com/a/43457343/603516
ヴァジム・

このコードは機能しません。OffsetDateTimeodt = instant.atOffset(ZoneOffset.UTC); odt.toString():2014-11-14T14:05:09 + 00:00同じフォーマット2014-11-14T14:05:09 + 00:00を持つ新しいJava 8コードはありますか?ありがとう
ボブボルデン

@BobBoldenあなたは正しい、デフォルトのZ代わりに使用さ+00:00れます。回答を修正しました。ありがとうございます。ちなみに、これらは同じことを意味しZます。「ズールー」と発音されている場合は、0時間分分秒のオフセットを意味し、と同じ+00:00です。ISO 8601規格では、両方のスタイルをサポートしています。
バジルブルク

@BasilBourque申し訳ありませんが、これは不明確です。私はJava 8を使用していますが、instant.atOffset()はまったくありません。instant.atOffset()なしで正確に同じフォーマット2014-11-14T14:05:09 + 00:00を持つJava 8の正しいコードを教えてください。私は少し迷っています:(
ボブ・ボルデン

@BobBolden実際、Java 8のクラスにはatOffsetメソッドがあります。JavadocをInstant参照してください Instant::atOffset。Java 8では、次のような呼び出しInstant.now().atOffset( ZoneOffset.UTC ).toString()が実行されます。importステートメントを確認してください。IDE /プロジェクトが以前のバージョンのJavaではなくJava 8以降を実行するように設定されていることを確認します。IdeOne.comで実行中のコードをご覧ください:ideone.com/2Vm2O5
バジル

19

昔ながらのJavaの代替ワンライナー:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

これは、使用してフォーマッタ相対インデックスを代わりにSimpleDateFormatされたスレッドセーフではない、ところで。

少し繰り返しが多いですが、必要なのは1つのステートメントだけです。これは、場合によっては便利です。


1
これは天才です。制約のある環境でのパフォーマンスが大幅に向上
Ruslan

9

Joda(org.joda.time.DateTime)を使用しないのはなぜですか?基本的にワンライナーです。

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

DateTimeオブジェクトにJVMの現在のデフォルトのタイムゾーンを割り当てるのではなく、DateTimeZoneも渡すことをお勧めします。new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
バジルブルク2014年

7

SimpleDateFormatを探しているようです。

形式:yyyy-MM-dd kk:mm:ss


「kk」は何か特別なことをしますか?エリックは24時間以内にそれを望んでいると思います。
チャーリーソルト

2
はい、時間(1〜24)ですが、これはOPが必要とするものではない可能性があります。HH(0-23)がより一般的です。
BalusC 2011

1
@Cahrlie Salts kkは1から24までで、HHは0から23までです。おそらく、彼が1から24を望んでいると想定するのは少し大げさでした。@BalusC DateFormatオブジェクトは解析とフォーマットの両方を行います。
pickypg 2011

最後のコメントの関連性がわかりません。私のコメントはチャーリーです。
BalusC 2011

私は.Net形式に慣れています。HHは24時間、hhは午前/午後です。したがって、頭を引っかく。
Charlie Salts、2011

5

シングルショットで;)

日付を取得するには

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

時間を取得するには

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

日付と時刻を取得するには

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

ハッピーコーディング:)


1
FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8&9のJavaを参照してくださいに組み込まれたクラスOracleでのチュートリアル
バジルブルク2018

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

これを使用する最も簡単な方法は次のとおりです。

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

ここで、「yyyy-MM-dd'T'HH:mm:ss」は、読み取り日の形式です。

出力:Sun Apr 14 16:11:48 EEST 2013

注:HH vs hh-HHは24時間形式を指します-hhは12時間形式を指します


問題は、反対の変換についてです。
Vadzim

4

日付からの時間だけが必要な場合は、Stringの機能を使用できます。

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

これにより、文字列の時間部分が自動的にカットされ、内に保存されますtimeString


これはロケールが異なると壊れる可能性があります。
Vadzim

4

新しいJava 8 Time API使用してレガシー をフォーマットする例を次に示しますjava.util.Date

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

DateTimeFormatter(とは異なりSimpleDateFormat)スレッドセーフであるため、効率的にキャッシュできるのは素晴らしいことです。

定義済みのフォーマットとパターン表記リファレンスのリスト

クレジット:

LocalDateTimeで日付を解析/フォーマットする方法は?(Java 8)

Java8 java.util.Dateからjava.time.ZonedDateTimeへの変換

インスタントを文字列にフォーマット

Java 8 ZonedDateTimeとOffsetDateTimeの違いは何ですか?


2

これを試して、

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

出力:

2013-05-14 17:07:21

Javaでの日付と時刻のフォーマットの詳細については、以下のリンクを参照してください

Oracleヘルプセンター

Javaでの日時の例


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

やってみよう

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

またはユーティリティ関数

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Javaで文字列に変換日


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String


1

1行オプション

このオプションは、実際の日付を書き込むための簡単な1行を取得します。

これはCalendar.classand SimpleDateFormatを使用しているため、Java8で使用するのは論理的ではないことに注意してください。

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

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

1
(1)答えが間違っています(ちょうど2019-20-23 09:20:2220か月ですか??)(2)答えが他の回答でまだカバーされていないものを提供していることがわかりません。(3)古くて悪名高い面倒なSimpleDateFormat授業を若い人に教えないでください。少なくとも最初のオプションではありません。予約なしではありません。今日、私たちはjava.time、最新のJava日時APIとそのを非常によく利用していますDateTimeFormatter
Ole VV

ええ....私は間違いを犯し、それを修正するのを忘れました。私はすぐにそれを追加し、覚えていませんでした。そして、コメントの皆さん、ありがとう
Alejandro TeixeiraMuñoz19年

@ OleV.V。すべての人がModern Javaのデータと時間APIにアクセスできるわけではありません......だから...この答えも有効です...
Alejandro TeixeiraMuñoz19年

1
ご意見ありがとうございます。Java 5、またはJava 6と7に外部依存関係のない回答を提供したい場合は、それで構いません。大丈夫です。それがあなたがしていることであることを明確にしてください。そして、あなたの答えはまだ間違っています、あなたは新年の周りに驚きを得るでしょう。
Ole VV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.