String
「2010年1月2日」の形式のaDate
をJavaでに変換する最良の方法は何ですか?
最終的には、月、日、年を整数に分割して、使用できるようにします。
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
日付を時刻に変換します。
String
「2010年1月2日」の形式のaDate
をJavaでに変換する最良の方法は何ですか?
最終的には、月、日、年を整数に分割して、使用できるようにします。
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
日付を時刻に変換します。
これは難しい方法であり、これらのjava.util.Date
セッターメソッドはJava 1.1(1997)以降非推奨になっています。さらに、Java 8(2014)java.util.Date
でAPIが導入されて以来、クラス全体が事実上非推奨(非推奨)になりました。java.time
DateTimeFormatter
入力文字列に一致するパターンを使用して日付をフォーマットするだけです(チュートリアルはこちらから入手できます)。
入力文字列としての「2010年1月2日」の特定のケースでは、次のようになります。
MMMM
パターンを使用してくださいd
パターンを使用します。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を使用していない場合、または使用を余儀なくされている場合は、入力文字列に一致するフォーマットパターンを使用し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
はないということです。つまり、静的変数またはインスタンス変数として宣言して割り当ててから、別のメソッド/スレッドから再利用しないでください。メソッドのローカルスコープ内で常に新しいものを作成する必要があります。
そうそう、Java Date の議論です。日付操作に対処するには、Date、Calendar、GregorianCalendar、および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));
String str_date = "11-June-07";
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
Date date = formatter.parse(str_date);
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;
一部の回答は技術的には正しいものですが、お勧めできません。
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
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();
}
それは私にとってはうまくいきます。
SimpleDateFormat クラスを扱う場合、Date はスレッドセーフではなく、1 つの Date オブジェクトを複数のスレッドで共有できないことに注意してください。
また、「m」と「M」には大きな違いがあり、小文字は分、大文字は月に使用されます。「d」と「D」も同様です。これにより、見過ごされがちな微妙なバグが発生する可能性があります。詳細については、 JavadocまたはJava で文字列を日付に変換するためのガイドを参照してください。
文字列を日付に変更するには SimpleDateformat を使用できます
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = sdf.parse(strDate);
また、SimpleDateFormat は、GWTなどの一部のクライアント側テクノロジでは使用できません。
Calendar.getInstance() を使用することをお勧めします。要件は 2 つの日付を比較することです。ロングデートに行く。
文字列から日付への変換:
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;
}
これを試して
String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);