私はJavaに慣れていません。通常はPHPで動作します。
私はこの文字列を変換しようとしています:
月Mar 14 16:02:37 GMT 2011
このように年と月を簡単に取得できるように、Calendarオブジェクトに入れます。
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
手動で解析するのは悪い考えでしょうか。サブストリング方式を使用しますか?
どんなアドバイスでも感謝するのを助けるでしょう!
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
を設定してください
関連項目
そうです、 SimpleDateFormat
のようなクラスに既に存在するコードを複製するのは悪い考えだと思います。
一方、個人的には、可能であればCalendar
とDate
を完全に避け、代わりに Joda Time をはるかに優れた設計の日時APIとして使用することをお勧めします。たとえば、SimpleDateFormat
はnot thread-safeであることに注意する必要があります。そのため、使用するたびにスレッドローカル、同期、または新しいインスタンスが必要になります。 Jodaのパーサとフォーマッタareスレッドセーフです。
現代のアプローチは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 );
入力:月曜日14 16:02:37 GMT 2011
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
のような、面倒な古い レガシー 日時クラスに代わるものです。
メンテナンスモード になった Joda-Time プロジェクトは、Java.timeへの移行をお勧めします。
詳しくは、 Oracle Tutorial を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがあります。
新しいカレンダーを作成する必要はありません。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();
(まだコメントできません、それで私は新しい答えを作ったのです)
SimpleDateFormat
は素晴らしいです。時間を扱う場合、HH
はhh
とは異なることに注意してください。 HH
は24時間ベースの時間を返し、hhは12時間ベースの時間を返します。
たとえば、次は12時間の時間を返します。
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
これは24時間の時間を返しますが:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
はい、それを自分で解析するのは悪い習慣でしょう。 SimpleDateFormat を見てください。これはStringをDateに変換し、DateをCalendarインスタンスに設定することができます。
タイムゾーンで時間を解析します。パターン内の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
に設定されたタイムゾーンを使用します
簡単な方法:
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;
}