web-dev-qa-db-ja.com

JavaでStringをCalendarオブジェクトに変換する

私はJavaに慣れていません。通常はPHPで動作します。

私はこの文字列を変換しようとしています:

月Mar 14 16:02:37 GMT 2011

このように年と月を簡単に取得できるように、Calendarオブジェクトに入れます。

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

手動で解析するのは悪い考えでしょうか。サブストリング方式を使用しますか?

どんなアドバイスでも感謝するのを助けるでしょう!

151
Doug Molineux
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を設定してください


関連項目

359
Jigar Joshi

そうです、 SimpleDateFormat のようなクラスに既に存在するコードを複製するのは悪い考えだと思います。

一方、個人的には、可能であればCalendarDateを完全に避け、代わりに Joda Time をはるかに優れた設計の日時APIとして使用することをお勧めします。たとえば、SimpleDateFormatnot thread-safeであることに注意する必要があります。そのため、使用するたびにスレッドローカル、同期、または新しいインスタンスが必要になります。 Jodaのパーサとフォーマッタareスレッドセーフです。

14
Jon Skeet

tl; dr

現代のアプローチは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.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、& SimpleDateFormat のような、面倒な古い レガシー 日時クラスに代わるものです。

メンテナンスモード になった Joda-Time プロジェクトは、Java.timeへの移行をお勧めします。

詳しくは、 Oracle Tutorial を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • バンドル実装の標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
    • Java.timeの機能の多くは ThreeTen-Backport でJava 6と7にバックポートされています。
  • Android
    • ThreeTenABP プロジェクトは、特にAndroid用にThreeTen-Backport(上記の)に適応します。
    • の使い方… を参照してください。

ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

13
Basil Bourque

新しいカレンダーを作成する必要はありません。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();

(まだコメントできません、それで私は新しい答えを作ったのです)

9
GoGoris

SimpleDateFormatは素晴らしいです。時間を扱う場合、HHhhとは異なることに注意してください。 HHは24時間ベースの時間を返し、hhは12時間ベースの時間を返します。

たとえば、次は12時間の時間を返します。

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");

これは24時間の時間を返しますが:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
5
Philip

はい、それを自分で解析するのは悪い習慣でしょう。 SimpleDateFormat を見てください。これはStringをDateに変換し、DateをCalendarインスタンスに設定することができます。

3
John Vint

タイムゾーンで時間を解析します。パターン内の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

enter image description here

タイムゾーンをyyyy-MM-dd'T'HH:mm:ssのようなパターンに設定しない場合。 SimpleDateFormatSettingに設定されたタイムゾーンを使用します

1
Phan Van Linh

簡単な方法:

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;
}
0