文字列をJavaの異なる形式で日付に解析する


91

別の形式に変換StringしたいDate

例えば、

私はユーザーから取得しています、

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

これfromDate"yyyy-MM-dd"フォーマットの日付オブジェクトとして変換したい

これどうやってするの?


2
Dateオブジェクトには形式がなく、日付を表す数値にすぎません。日付は、「yyyy-MM-dd」の形式の文字列で表すことができます。
user85421 2009年

回答:


181

を見てくださいSimpleDateFormat。コードは次のようになります。

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}

1
文字列形式を取得する代わりに、形式で出力を取得できDateますか?
レイチェル

4
@レイチェル:確かに、ただ使っparseてくださいformatparse文字列を日付に解析します。
マイケルマイヤーズ

3
しかしparse、私はになりますdate formatようにFri Jan 06 00:01:00 EST 2012、それはで必要な2012-01-06日付フォーマット
レイチェル

1
@RachelはSystem.out.println(anyDateObject)、デフォルトのtoString()メソッドが呼び出されたときに、その形式で出力すると言われているためですFri Jan 06 00:01:00 EST 2012。あなたはあなたのニーズに合わせてそれをオーバーライドする必要があります。
KNU 2014

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

13

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

詳細

他との回答java.util.Datejava.sql.DateSimpleDateFormat今時代遅れされています。

LocalDate

日付/時刻を行う最新の方法は、具体的にはjava.timeクラスを使用することLocalDateです。LocalDateクラスは、時間日の時間帯なしなし日付専用の値を表しています。

DateTimeFormatter

日時値を表す文字列を解析または生成するには、DateTimeFormatterクラスを使用します。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

日付時刻オブジェクトをその値を表す文字列と混同しないでください。日時オブジェクトにはフォーマットがありませんが、ストリングにはあります。などの日時オブジェクトは、内部値を表す文字列を生成LocalDateできますが、日時オブジェクトと文字列は別個の別個のオブジェクトです。

文字列を生成するために任意のカスタム形式を指定できます。または、java.timeに自動的にローカライズする作業をさせます。

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

コンソールにダンプします。

System.out.println( "ld: " + ld + " | output: " + output );

ld:2009-05-19 | 出力:mardi 19 mai 2009

IdeOne.comで実際の動作を確認してください


java.timeについて

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

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

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

java.timeオブジェクトをデータベースと直接交換できます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

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

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

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


12

SimpleDateFormatクラスを使用します。

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

使用法:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

効率を上げるために、フォーマッタをハッシュマップに保存することをお勧めします。ハッシュマップは、utilクラスの静的メンバーです。

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}

9
警告!!アイデアは良いですが、実装は良くありません。DateFormatはスレッドセーフではないため、静的に保存しないでください。それらが複数のスレッドから使​​用されている場合(そして、これは静的変数では常に危険です)。FindBugsにはこのための検出器が含まれています(噛まれた後、偶然最初に貢献しました。dschneller.blogspot.com/ 2007/04 /…を参照してください。:
Daniel Schneller

あなたのブログエントリは興味深い読み物です:-) parseDateメソッド自体が同期した場合はどうなりますか?しかし問題はおそらくそれがコードを遅くするだろうということです...
Agora

1
parseDateメソッドがマップにアクセスする唯一のメソッドである限り、同期は機能します。しかし、これは-あなたが言うように-ボトルネックを導入します。
Daniel Schneller、

8

文字列の日付をjava.sql.Dateに変換します

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010


3

一方でSimpleDateFormat、実際のニーズのための作業、さらにあなたがチェックアウトする場合がありますジョダ時間、私は多くのそれを使用していないものの、明らかJavaの7のやり直し日ライブラリーの基礎である、私は何もなく、良いものを聞いたことがないしましたそれについてそしてあなたのプロジェクトで広範囲に日付を操作するなら、それはおそらく調べる価値があります。


1

日付をフォーマットして文字列に変換する簡単な方法

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

出力:dd / mm / dd形式の日付:2015年10月21日


1

Dateオブジェクトが持っていないいかなる形式をそれが表現です、。日付は、任意String形式で表示できます

たとえば「yyyy-MM-dd」、「yy-MMM-dd」、「dd-MMM-yy」など

これを達成するために、あなたはの使用を得ることができます SimpleDateFormat

これを試して、

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

この出力:2009-05-19


1

次のような文字列があるとします。

String mDate="2019-09-17T10:56:07.827088"

ここStringで、JavaKotlinでこの形式を個別の日付と時刻に変更します。

JAVA:

抽出日付のメソッドがあります

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return これは:09/17/2019

そして、抽出時間の方法があります:

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnこれは: 10 : 56 AM

コトリン:

抽出日付の関数があります

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return これは:09/17/2019

そして、抽出時間の方法があります:

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnこれは: 10 : 56 AM


若者に、古くて悪名高い面倒なSimpleDateFormat授業を教えないでください。少なくとも最初のオプションではありません。予約なしではありません。今日、私たちはjava.time、最新のJava日時APIとそのを非常によく利用していますDateTimeFormatter。またSimpleDateFormat、秒(マイクロ秒)の小数点以下6桁を正しく解析できません。
Ole VV

2番目のスニペットを実行する10:56 AMと、11:09 AM期待どおりに表示されませんが、代わりに(Oracle jdk-11.0.3でテストされています)。
Ole VV

@ OleV.V。、メソッドが古くなっている場合は、その行に記号を付けて非推奨にします。メソッドまたはクラスが非推奨でない場合は、使用できますが、最善の方法だとは言いませんが、より良い方法があるかもしれませんが、このようにしてくださいシンプルで理解しやすい、メソッドまたはクラスが古い場合、それが面倒であるという理由はなく、使用DateTimeFormatterするためにminsdk 26それ以上にする必要がある
milad salimi

@ OleV.V。しかし、あなたのコメントとあなたの2番目のコメントのおかげで、私は2つの10:56 AM
アプリケーション

1
@ OleV.V。、わかりましたが、私は方法がない場合、またはそのAPI(ライブラリ)が私のコードよりも非常に優れている場合にライブラリを使用します。ライブラリを追加すると、使用されない可能性のあるコードがプロジェクトに追加され、これがあなたにとってオーバーロードになるためです。プロジェクト、これは私のアプローチであり、あなたのアプローチは私にとって立派です。
milad salimi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.