Joda Timeライブラリを使用して日付文字列をDateTimeオブジェクトに変換する


246

次の形式の文字列として日付があります"04/02/2011 20:27:05"。Joda-Timeライブラリを使用していDateTimeますが、それをオブジェクトに変換したいと考えています。やった:

DateTime dt = new DateTime("04/02/2011 20:27:05")

しかし、次のエラーが発生します。

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

上記の日付をDateTimeオブジェクトに変換するにはどうすればよいですか?


2
java.timeJava 8 のパッケージを使用して日付文字列を解析する方法を探している方は、LocalDateTime.parseまたはを使用してみてくださいInstant.parse
heenenee

1
FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Oracleによるチュートリアルを参照してください。
Basil Bourque 2017

回答:


477

使用DateTimeFormat

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
こんにちは、フォーマッタがタイムゾーンを受け入れない可能性はありますか?toString関数を適用すると、「zz」は「MEZ」を返しますが、解析できません:Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ"。これは既知の問題ですか?どうすれば回避できますか?よろしく。
Danyel 2013年

2
@Danyel:このDateTimeFormat.forPattern( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z '").withLocale(Locale.ROOT).withChronology(ISOChronology.getInstanceUTC())のようなタイムゾーンを追加できます;
Hyque 2013

2
「2014-11-04T17:41:52.000 + 01:00」は、「+ 01:00」で次のフォーマッタを使用して不正な形式になっています:private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern( "yyyy-MM- dd'T'HH:mm:ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime((String)customSoftware.get(header [3]))on joda-time 2.2
Stephane

2
ZZの周りの単一引用符を削除した後、機能しました。これらの単一引用符が何を意味するのか不思議に思っています...
ステファン

2
@StephaneEybert(または他の誰か)単一引用符は、何かが文字列で予期されるリテラル文字であり、パターンの一部とは見なされないことを意味します。たとえば、何らかの理由で日付が "2015-08-dd30"となる場合は、 "yyyy-MM-'dd'dd"を指定します。これは、最初のddが文字列で予期されるリテラル部分であることを示し、 2番目のdd(アポストロフィの外)は、解析する必要がある実際の日です。したがって、以前のケースでは、実際のタイムゾーンの代わりに、受信したdatetime-stringの末尾に「ZZ」を入れた場合に機能します。
SadBunny、2015

62

これは古い質問であることはわかっていますが、追加したいと思います。JodaTime2.0以降、ワンライナーでこれを行うことができます。

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
インポートセクションには何を入れればよいですか?
ドミトリー

20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

7
DateTimeFormat.forPattern( "dd / MM / yyyy HH:mm:ss")。parseDateTime( "04/02/2011 20:27:05")
sufinawaz

16

コメントから私はのような答えを選び、TimeZoneを追加しました:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

13

あなたのフォーマットは期待されるISOフォーマットではありません、あなたは試す必要があります

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");

5

また、使用することができてSimpleDateFormatをのように、DateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}

3
kirlisakalはこの場合は使用しませんが、SimpleDateFormatの共有インスタンスを作成しないでください。スレッドセーフではないため、デバッグするのは悪夢です
dannrob

2
FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8&9のJavaを参照してくださいに組み込まれたクラスOracleでのチュートリアル。また、java.timeクラスは、従来のクラスとは異なり、スレッドセーフです。
Basil Bourque 2017

3

使用している形式に適したDateTimeFormatterが必要です。作成方法については、ドキュメントをご覧ください。

袖口から、私はあなたが必要だと思います format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

tl; dr

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

最新のアプローチでは、由緒あるJoda -Timeプロジェクトに取って代わるjava.timeクラスを使用します。

LocalDateTime入力としてタイムゾーンまたはUTCからのオフセットのインジケーターがないので、として解析します。

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString():2011-02-04T20:27:05

ヒント:日時の値をここで見られる形式ではなくテキストとして交換する場合は、可能であれば、標準のISO 8601形式を使用してください。便利なことに、java.timeクラスは文字列の解析/生成時に標準形式を使用します。


java.timeについて

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

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

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

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

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


2

簡単な方法:

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}

0

ある二つの方法、これができ達成が

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011

どちらも時代遅れです。現代的な方法もあります。バジル・ブルクの答えあります。また、他のいくつかの回答に含まれていないものは何も提供していません。そして、Joda-Timeが求められたとき、さらに長く古くて悪名高い面倒を示唆することSimpleDateFormatは、私の最も正直な意見では悪いことです。
Ole VV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.