Javaで 'January 2、2010'の形式のString
をDate
に変換するための最良の方法は何ですか?
最終的に、月、日、年を整数として分割して、使用できるようにします。
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
日付を時間に変換します。
それは難しい方法です、そしてそれらのJava.util.Date
セッターメソッドはJava 1.1(1997)以来非推奨です。 入力文字列にマッチするフォーマットパターンを使ってSimpleDateFormat
を使って単純に日付をフォーマットします 。
入力文字列として「2010年1月2日」という特定のケースでは、
MMMM
パターンを使用してください。d
パターンを使用してください。yyyy
パターンを使用してください。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 から関連性を抜粋したもので、使用可能なすべてのフォーマットパターンがリストされています。
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
パターンでは大文字と小文字が区別され、4文字以上のテキストベースのパターンは完全形式を表します。それ以外の場合は、使用可能であれば短い形式または省略形式が使用されます。だから例えばMMMMM
以上は不要です。
これは与えられた文字列を今日までに解析するための有効なSimpleDateFormat
パターンのいくつかの例です:
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time 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
Wed, 4 Jul 2001 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
はnot thread safeであるということです。つまり、静的変数またはインスタンス変数として宣言して代入してから、異なるメソッドやスレッドから再利用してはいけません。メソッドのローカルスコープ内で常に新しく作成する必要があります。
Java 8以降であれば、 DateTimeFormatter
を使用してください(ここでもリンクをクリックすると、すべての定義済みフォーマッタと使用可能なフォーマットパターンが表示されます。 チュートリアルはこちらから入手できます )。この新しいAPIは JodaTime に触発されています。
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 から関連性を抜粋したもので、使用可能なすべてのフォーマットパターンがリストされています。
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;
これにはいくつかの 定義済みフォーマッタがあります より一般的なパターン用です。だから代わりにDateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
、あなたはDateTimeFormatter.RFC_1123_DATE_TIME
を使うことができます。これは可能です。なぜならそれらはSimpleDateFormat
とは反対にスレッドセーフだからです。したがって、必要に応じて独自のものを定義することもできます。
特定の入力文字列フォーマットのために、明示的なDateTimeFormatter
を使う必要はありません:2016-09-26T17:44:57Zのような標準の ISO 8601 dateは LocalDateTime#parse(text)
として直接解析することができますすでに ISO_LOCAL_DATE_TIME
フォーマッタを使用しています。同様に、 LocalDate#parse(text)
は時間コンポーネントなしでISO日付を解析し( ISO_LOCAL_DATE
を参照)、 ZonedDateTime#parse(text)
はオフセットとタイムゾーンを追加してISO日付を解析します( ISO_ZONED_DATE_TIME
を参照)。
ああ、それでも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;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
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 を使用してください。どちらもLocalDate
に似たparse()
メソッドを提供します。
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 オブジェクトは、独自に割り当てられたタイムゾーンを本当に認識しています。これは、msがタイムゾーンを持っているように見えますが、持っていないJava.util.Dateクラスと対照的です。
以下のコード例では、文字列を解析するフォーマッタにタイムゾーンオブジェクトを渡す方法に注意してください。そのタイムゾーンは、その日時がそのタイムゾーンで発生したものとして解釈するために使用されます。そのため、その文字列入力によって表されるタイムゾーンについて考え、決定する必要があります。
入力文字列に時間部分がないため、Joda-Timeは指定されたタイムゾーンの1日の最初の瞬間を時刻として割り当てます。通常、これは00:00:00
を意味しますが、 サマータイム(DST) またはその他の異常のため、常にではありません。ちなみに、withTimeAtStartOfDay
を呼び出すことで、任意のDateTimeインスタンスに同じことができます。
フォーマッタのパターンで使用される文字は、Joda-TimeでJava.util.Date/Calendarの文字と似ていますが、まったく同じではありません。ドキュメントを注意深く読んでください。
通常、Joda-Timeでは不変クラスを使用します。既存のDate-Timeオブジェクトを変更するのではなく、変更が必要な場合を除き、ほとんどの側面がコピーされた他のオブジェクトに基づいて新しい新しいインスタンスを作成するメソッドを呼び出します。例は、最後の行のwithZone
の呼び出しです。 Immutability は、Joda-Timeを非常にスレッドセーフにするのに役立ち、一部の作業をより明確にすることもできます。
Joda-Timeオブジェクトを知らない他のクラス/フレームワークで使用するには、Java.util.Dateオブジェクトが必要です。幸いなことに、前後に移動するのは非常に簡単です。
Java.util.Dateオブジェクト(ここではdate
という名前)からJoda-Time DateTimeへ…
org.joda.time.DateTime dateTime = new DateTime( date, timeZone );
Joda-TimeからJava.util.Dateオブジェクトへの別の方向へ…
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 ) );
実行すると…
dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
SimpleDateFormatクラスの処理中は、Dateはスレッドセーフではなく、単一のDateオブジェクトを複数のスレッドと共有することはできません。
また、 "m"と "M"の間には大きな違いがあります。小さなケースは分に使用され、大文字のケースは月に使用されます。 "d"および "D"と同じです。これは、見落とされがちな微妙なバグを引き起こす可能性があります。詳細は Javadoc またはJavaで文字列を日付に変換するためのガイドを参照してください。
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();
}
それは私にとってはうまくいきます。
我々が使用した単純な2つのフォーマッタ
完全な日付を時間形式に解析します。
date="2016-05-06 16:40:32";
public static String setDateParsing(String date) throws ParseException {
// This is the format date we want
DateFormat mSDF = new SimpleDateFormat("hh:mm a");
// This format date is actually present
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
return mSDF.format(formatter.parse(date));
}
また、SimpleDateFormatは、 _ gwt _ などの一部のクライアント側テクノロジでは使用できません。
Calendar.getInstance()を使用することをお勧めします。2つの日付を比較することが要件です。長い間行きなさい。
私の謙虚なテストプログラム私はそれを使って、私がログファイルで見つけたフォーマッタと長い検索日を試しています(しかし、誰がそれらをそこに置いたのか...)。
私のテストプログラム:
package be.test.package.time;
import Java.text.DateFormat;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.ArrayList;
import Java.util.Date;
import Java.util.List;
import Java.util.TimeZone;
public class TimeWork {
public static void main(String[] args) {
TimeZone timezone = TimeZone.getTimeZone("UTC");
List<Long> longs = new ArrayList<>();
List<String> strings = new ArrayList<>();
//Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
//Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
formatter.setTimeZone(timezone);
Date now = new Date();
//Test dates
strings.add(formatter.format(now));
strings.add("01-01-1970 00:00:00.000");
strings.add("01-01-1970 00:00:01.000");
strings.add("01-01-1970 00:01:00.000");
strings.add("01-01-1970 01:00:00.000");
strings.add("01-01-1970 10:00:00.000");
strings.add("01-01-1970 12:00:00.000");
strings.add("01-01-1970 24:00:00.000");
strings.add("02-01-1970 00:00:00.000");
strings.add("01-01-1971 00:00:00.000");
strings.add("01-01-2014 00:00:00.000");
strings.add("31-12-1969 23:59:59.000");
strings.add("31-12-1969 23:59:00.000");
strings.add("31-12-1969 23:00:00.000");
//Test data
longs.add(now.getTime());
longs.add(-1L);
longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
longs.add(1L);
longs.add(1000L);
longs.add(60000L);
longs.add(3600000L);
longs.add(36000000L);
longs.add(43200000L);
longs.add(86400000L);
longs.add(31536000000L);
longs.add(1388534400000L);
longs.add(7260000L);
longs.add(1417706084037L);
longs.add(-7260000L);
System.out.println("===== String to long =====");
//Show the long value of the date
for (String string: strings) {
try {
Date date = formatter.parse(string);
System.out.println("Formated date : " + string + " = Long = " + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
System.out.println("===== Long to String =====");
//Show the date behind the long
for (Long lo : longs) {
Date date = new Date(lo);
String string = formatter.format(date);
System.out.println("Formated date : " + string + " = Long = " + lo);
}
}
}
試験結果:
===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000
SimpleDateformatを使って文字列を日付に変更することができます
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());
ソース リンク
Android の場合
Calendar.getInstance()。getTime()
Thu Jul 26 15:54:13 GMT+05:30 2018
を使用
String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);