回答:
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
注:Locale
環境/要件に応じて設定
こちらもご覧ください
java.time
。このQ / Aはグーグルでかなり目立つようになります。
最新のアプローチでは、java.timeクラスを使用します。
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
2011-03
最新の方法は、java.timeクラスを使用する方法です。次のような古い日時クラスCalendar
、設計が不十分で、混乱し、面倒であることが証明されています。
文字列入力に一致するカスタムフォーマッタを定義します。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
として解析しますZonedDateTime
。
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
あなたは年と月に興味があります。java.timeクラスにはYearMonth
、そのためのクラスが含まれています。
YearMonth ym = YearMonth.from( zdt );
必要に応じて、年と月の番号を問い合わせることができます。
int year = ym.getYear();
int month = ym.getMonthValue();
ただし、このtoString
メソッドは標準のISO 8601形式で文字列を生成します。
String output = ym.toString();
これをすべてまとめます。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();
コンソールにダンプします。
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
入力:2011年3月14日16:02:37 GMT
zdt:2011-03-14T16:02:37Z [GMT]
ym:2011-03
IdeOne.comで実行されているこのコードを参照してください。
あなたがいる場合必要があります持っているCalendar
オブジェクトを、あなたがに変換することができGregorianCalendar
、古いクラスに追加使用して、新しい方法。
GregorianCalendar gc = GregorianCalendar.from( zdt );
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.Date
、Calendar
&を、SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモード、java.timeへの移行をアドバイスします。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
まあ、私はすでにのようなクラスに存在しているコードを複製するのは悪い考えだと思います SimpleDateFormat
。
一方、個人的には、可能であれば完全に回避しCalendar
、代わりにJoda TimeDate
を使用して、はるかに優れた設計の日時APIとして使用することをお勧めします。たとえば、はスレッドセーフではないことに注意する必要があるため、使用するたびにスレッドローカル、同期、または新しいインスタンスが必要になります。Jodaパーサーとフォーマッターはスレッドセーフです。SimpleDateFormat
java.time
がその道です。BasilBourqueが素晴らしい答えを出しました。
新しいカレンダーを作成する必要はありません。SimpleDateFormatはすでにその下のカレンダーを使用しています。
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();
(まだコメントはできません。そのため、新しい回答を作成しました)
Z
時間帯のパターンを時間帯で解析します
String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(aTime));
Log.i(TAG, "time = " + cal.getTimeInMillis());
} catch (ParseException e) {
e.printStackTrace();
}
出力:UTC時間を返します
1508899140000
のようなパターンでタイムゾーンを設定しない場合yyyy-MM-dd'T'HH:mm:ss
。SimpleDateFormat
で設定されているタイムゾーンを使用しますSetting
はい、自分で解析するのは悪い習慣です。SimpleDateFormatを見てください。文字列を日付に変換し、日付をカレンダーインスタンスに設定できます。
簡単な方法:
public Calendar stringToCalendar(String date, String pattern) throws ParseException {
String DEFAULT_LOCALE_NAME = "pt";
String DEFAULT_COUNTRY = "BR";
Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
Date d = format.parse(date);
Calendar c = getCalendar();
c.setTime(d);
return c;
}