972

String「2010年1月2日」の形式のaDateをJavaでに変換する最良の方法は何ですか?

最終的には、月、日、年を整数に分割して、使用できるようにします。

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

日付を時刻に変換します。

4

17 に答える 17

1782

これは難しい方法であり、これらのjava.util.DateセッターメソッドはJava 1.1(1997)以降非推奨になっています。さらに、Java 8(2014)java.util.DateでAPIが導入されて以来、クラス全体が事実上非推奨(非推奨)になりました。java.time

DateTimeFormatter入力文字列に一致するパターンを使用して日付をフォーマットするだけです(チュートリアルはこちらから入手できます)。

入力文字列としての「2010年1月2日」の特定のケースでは、次のようになります。

  1. 「1月」は全文月なので、MMMMパターンを使用してください
  2. 「2」は月の短い日なので、dパターンを使用します。
  3. 「2010」は4桁の年なので、yyyyパターンを使用してください。
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

注:フォーマットパターンに時間部分も含まれている場合は、のLocalDateTime#parse(text, formatter)代わりにを使用してLocalDate#parse(text, formatter)ください。また、フォーマットパターンにタイムゾーンも含まれている場合は、ZonedDateTime#parse(text, formatter)代わりに使用してください。

これは、javadocからの関連性の抜粋であり、使用可能なすべてのフォーマットパターンをリストしています。

シンボル 意味 プレゼンテーション
G 時代 文章 広告; 西暦; A
u 2004; 04
y 時代の年 2004; 04
D 年間通算日 番号 189
M/L 年の月 番号/テキスト 7; 07; 7月; 7月; J
d 月の日 番号 10
Q/q 四半期の年 番号/テキスト 3; 03; Q3; 第3四半期
Y 週ベースの年 1996; 96
w 週ベースの年 番号 27
W 月の週 番号 4
E 曜日 文章 火; 火曜日; T
e/c ローカライズされた曜日 番号/テキスト 2; 02; 火; 火曜日; T
F 月の週 番号 3
a am-pm-of-day 文章 午後
h 午前の時刻(1〜12) 番号 12
K 午前-午後(0-11) 番号 0
k 午前の時間帯(1-24) 番号 0
H 時間帯(0-23) 番号 0
m 分の時間 番号 30
s 分秒 番号 55
S 分数秒 分数 978
A ミリオブデイ 番号 1234
n ナノオブセカンド 番号 987654321
N ナノオブデイ 番号 1234000000
V タイムゾーンID ゾーンID アメリカ/Los_Angeles; Z; -08:30
z タイムゾーン名 ゾーン名 太平洋標準時; PST
O ローカライズされたゾーンオフセット オフセット-O GMT + 8; GMT + 08:00; UTC-08:00;
X ゾーン-ゼロのオフセット「Z」 オフセット-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x ゾーンオフセット オフセット-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z ゾーンオフセット オフセット-Z +0000; -0800; -08:00;

より一般的なパターン用にいくつかの事前定義されたフォーマッターがあることに注意してください。したがって、たとえばの代わりにDateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);、を使用できますDateTimeFormatter.RFC_1123_DATE_TIME。これは、逆にSimpleDateFormatスレッドセーフであるために可能です。したがって、必要に応じて、独自に定義することもできます。

特定の入力文字列形式の場合、明示的に使用する必要はありません。2016-09-26T17:44:57ZなどDateTimeFormatterの標準のISO 8601LocalDateTime#parse(text)日付は、すでにフォーマッターを使用しているため、で直接解析できますISO_LOCAL_DATE_TIME。同様にLocalDate#parse(text)、時間コンポーネントなしでISO日付を解析し(を参照ISO_LOCAL_DATE)、ZonedDateTime#parse(text)オフセットとタイムゾーンを追加してISO日付を解析します(を参照ISO_ZONED_DATE_TIME)。


Java8以前

まだJava8を使用していない場合、または使用を余儀なくされている場合は、入力文字列に一致するフォーマットパターンを使用しjava.util.Dateて日付をフォーマットします。SimpleDateFormat

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Locale明示的な引数の重要性に注意してください。これを省略すると、デフォルトのロケールが使用されます。これは、入力文字列の月の名前で使用されている英語である必要はありません。ロケールが入力文字列と一致しないjava.text.ParseException場合、フォーマットパターンが有効であるように見えても、混乱を招く可能性があります。

これは、javadocからの関連性の抜粋であり、使用可能なすべてのフォーマットパターンをリストしています。

手紙 日付または時刻コンポーネント プレゼンテーション
G 時代指定者 文章 広告
y 1996; 96
Y 週年 2009; 09
M/L 年の月 7月; 7月; 07
w 年間の週 番号 27
W 月の週 番号 2
D 年間の日 番号 189
d 月の日 番号 10
F 月の曜日 番号 2
E 曜日 文章 火曜日; 火曜日
u 曜日数 番号 1
a 午前/午後マーカー 文章 午後
H 1日の時間(0-23) 番号 0
k 1日の時間(1-24) 番号 24
K 午前/午後の時間(0-11) 番号 0
h 午前/午後の時間(1-12) 番号 12
m 時間の分 番号 30
s 分で2番目 番号 55
S ミリ秒 番号 978
z タイムゾーン 一般的なタイムゾーン 太平洋標準時; PST; GMT-08:00
Z タイムゾーン RFC822タイムゾーン -0800
X タイムゾーン ISO8601タイムゾーン -08; -0800; -08:00

パターンでは大文字と小文字が区別され、4文字以上のテキストベースのパターンは完全な形式を表すことに注意してください。それ以外の場合は、可能な場合は短縮形または省略形が使用されます。したがって、egMMMMM以上は不要です。

SimpleDateFormatこれまでに特定の文字列を解析するための有効なパターンの例を次に示します。

入力文字列 パターン
2001.07.04 AD 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
2001年7月4日水曜日 EEE, MMM d, ''yy
12:08 PM h:mm a
午後12時、太平洋夏時間 hh 'o''clock' a, zzzz
0:08 PM、PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
2001年7月4日水曜日12:08:56-0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u

重要な注意点は、スレッドセーフでSimpleDateFormatないということです。つまり、静的変数またはインスタンス変数として宣言して割り当ててから、別のメソッド/スレッドから再利用しないでください。メソッドのローカルスコープ内で常に新しいものを作成する必要があります。

于 2010-11-18T15:55:27.587 に答える
78

そうそう、Java Date の議論です。日付操作に対処するには、DateCalendarGregorianCalendar、およびSimpleDateFormatを使用します。たとえば、1 月の日付を入力として使用すると、次のようになります。

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

次に、次のようなものでそれを操作できます。

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));
于 2010-11-19T03:27:40.683 に答える
59
String str_date = "11-June-07";
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
Date date = formatter.parse(str_date);
于 2013-01-15T07:02:31.263 に答える
47

Java 8 では、新しい Date / Time API ( JSR 310 ) を取得します。

Joda-Timeに依存せずに Java 8 で日付を解析するには、次の方法を使用できます。

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDateは、日付 (時刻なし) を表すための標準 Java 8 クラスです。日付と時刻の情報を含む値を解析する場合は、LocalDateTimeを使用する必要があります。タイムゾーンを含む値には、ZonedDateTimeを使用します。どちらも次のようなparse()方法を提供しLocalDateます。

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

DateTimeFormatter Javadocからのリスト書式設定文字:

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
于 2014-03-04T18:56:18.987 に答える
29

一部の回答は技術的には正しいものですが、お勧めできません。

  • java.util.Date および Calendar クラスは厄介なことで有名です。設計と実装に欠陥があるため、それらは避けてください。幸いなことに、他に 2 つの優れた日時ライブラリを選択できます。
    • Joda-Time
      この人気のあるオープン ソースの無料ライブラリは、Java の複数のバージョンで使用できます。その使用例の多くは、StackOverflow で見つけることができます。これらのいくつかを読むと、すぐに慣れるのに役立ちます。
    • java.time.* パッケージ
      この新しい一連のクラスは、Joda-Time に触発され、JSR 310 によって定義されています。これらのクラスは Java 8 に組み込まれています。これらのクラスを Java 7 にバックポートするプロジェクトが進行中ですが、そのバックポートはオラクル。
  • クリストファー・ジョンソンが質問に対するコメントで正しく指摘したように、他の回答は次の重要な問題を無視しています。
    • Time of Day
      Date には、日付部分と時刻部分の両方があります)
    • 時間帯
      一日の始まりは時間帯によって異なります。タイム ゾーンを指定しない場合は、JVM のデフォルトのタイム ゾーンが適用されます。つまり、他のコンピューターで実行したり、タイム ゾーンの設定を変更したりした場合、コードの動作が変わる可能性があります。おそらくあなたが望むものではありません。
    • ロケール
      ロケールの言語は、解析中に検出された単語 (月と日の名前) を解釈する方法を指定します。( BalusC による回答はこれを適切に処理します。) また、ロケールは、日時の文字列表現を生成するときに一部のフォーマッタの出力に影響します。

Joda-Time

Joda-Time に関するいくつかのメモが続きます。

タイムゾーン

Joda -Timeでは、DateTimeオブジェクトは、割り当てられた独自のタイム ゾーンを真に認識しています。これは、タイムゾーンを持っているように見えるが、そうではないjava.util.Date クラスとは対照的です。

以下のコード例で、文字列を解析するフォーマッタにタイム ゾーン オブジェクトを渡す方法に注意してください。そのタイム ゾーンは、その日時がそのタイム ゾーンで発生したものとして解釈するために使用されます。そのため、その文字列入力によって表されるタイム ゾーンについて考え、決定する必要があります。

入力文字列に時間部分がないため、Joda-Time は指定されたタイム ゾーンの最初の瞬間を時刻として割り当てます。通常、これは00:00:00常にではありませんが、夏時間 (DST)またはその他の異常のためです。ちなみに、 を呼び出すことで、任意の DateTime インスタンスに対して同じことができますwithTimeAtStartOfDay

フォーマッタ パターン

フォーマッタのパターンで使用される文字は、Joda-Time と java.util.Date/Calendar の文字に似ていますが、まったく同じではありません。ドキュメントを注意深く読んでください。

不変性

通常、Joda-Time では不変クラスを使用します。既存の Date-Time オブジェクトを変更するのではなく、他のオブジェクトに基づいて新しい新しいインスタンスを作成するメソッドを呼び出し、変更が必要な場所を除いてほとんどの側面をコピーします。例は、withZone以下の最後の行の呼び出しです。不変性は、 Joda -Time を非常にスレッドセーフにするのに役立ち、一部の作業をより明確にすることもできます。

変換

Joda-Time オブジェクトを認識しない他のクラス/フレームワークで使用するには、java.util.Date オブジェクトが必要です。幸いなことに、前後に移動するのは非常に簡単です。

java.util.Date オブジェクト (ここでは という名前date) から Joda-Time DateTime へ…</p>

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Joda-Time から java.util.Date オブジェクトへの逆方向の移動…</p>

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

サンプルコード

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

実行すると…</p>

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
于 2014-02-13T08:22:28.133 に答える
21
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

それは私にとってはうまくいきます。

于 2013-12-04T12:46:06.143 に答える
20

SimpleDateFormat クラスを扱う場合、Date はスレッドセーフではなく、1 つの Date オブジェクトを複数のスレッドで共有できないことに注意してください。

また、「m」と「M」には大きな違いがあり、小文字は分、大文字は月に使用されます。「d」と「D」も同様です。これにより、見過ごされがちな微妙なバグが発生する可能性があります。詳細については、 JavadocまたはJava で文字列を日付に変換するためのガイドを参照してください。

于 2011-12-02T01:48:55.420 に答える
8

文字列を日付に変更するには SimpleDateformat を使用できます

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = sdf.parse(strDate);

于 2017-07-25T09:56:39.187 に答える
6

また、SimpleDateFormat は、GWTなどの一部のクライアント側テクノロジでは使用できません。

Calendar.getInstance() を使用することをお勧めします。要件は 2 つの日付を比較することです。ロングデートに行く。

于 2012-12-10T16:16:55.840 に答える
0

文字列から日付への変換:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }
于 2020-01-10T06:47:42.197 に答える
-1

これを試して

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
于 2016-05-31T08:33:30.157 に答える