1

org.joda.time.LocalDate オブジェクトを java.util.GregorianCalendar に変換したいと考えています。java.util.GregorianCalendar の月は、インデックス 0 から 11 で表示されます。つまり、10 月は 9 桁、11 月は 10 桁で表されます....LocalDate では、10 月は 10 桁で表され、11 月は 11 で表されます....

GregorianCalendar を使用している既存のアプリケーションに取り組んでいます。ここで、メソッド呼び出しで受け取った LocalDate 値を GregorianCalendar 形式に変換して、月の値が一致するようにします。

すでに多くのブログを検索しましたが、値を変換できませんでした。以下は私が試したコードですが、それでも日付形式を GregorianCalendar 形式に変更できませんでした。

ジャバコード:

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
class Convert{
    public static String format(GregorianCalendar calendar){
        SimpleDateFormat fmt = new SimpleDateFormat("dd-M-yyyy");
        fmt.setCalendar(calendar);
        String dateFormatted = fmt.format(calendar.getTime());
        System.out.println("--date formatted--- " + dateFormatted);
        return dateFormatted;
    }
    void convertLocalDateToGregorianCalendar(){
        LocalDate localDate = new LocalDate();
        DateTime dateTimeObj = localDate.toDateTimeAtStartOfDay();
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeInMillis(dateTimeObj.getMillis());
        String formattedGCDate = format(gc);
        System.out.println("converted LocalDate to GregorianDate date value " + formattedGCDate);
    }
    public static void main(String[] args) {
                new Convert().convertLocalDateToGregorianCalendar();         
} }

出力:

--date formatted--- 13-10-2016
converted LocalDate to GregorianDate date value 13-10-2016

出力で期待される日付値: 13-9-2016 (GregorianCalendar の場合、10 月は数字 9 で表されます)。

PS: java5 は私が使用しているバージョンです。

4

3 に答える 3

1

SimpleDateFormat を直接使用してグレゴリオ日付をフォーマットすることはできないと思います。回避策が2つあります。

1.calendar.getTime() を再利用したくない場合は、fmt.format の前に月を -1 ずつロール (または追加) できます。

SimpleDateFormat fmt = new SimpleDateFormat("dd-M-yyyy");
fmt.setCalendar(calendar);    
calendar.roll(Calendar.MONTH, -1); //or add
String dateFormatted = fmt.format(calendar.getTime());
System.out.println("--date formatted--- " + dateFormatted);

2.SimpleDateFormat を使用しないでください。calendar.get(Calendar.MONTH) は期待どおり 9 を返します。

public static String format(GregorianCalendar calendar){
    String dateFormatted = String.format("%s-%s-%s", calendar.get(Calendar.DATE),
                            calendar.get(Calendar.MONTH), calendar.get(Calendar.YEAR));
    System.out.println("--date formatted--- " + dateFormatted);
    return dateFormatted;
}
于 2016-10-14T03:15:46.857 に答える
1
于 2016-10-14T03:54:08.860 に答える
1

私が質問を正しく理解していれば、2つのものを混ぜています

a) Calender / GregorianCalender 内の月と実際の Calendar 自体の内部表現。

あなたが正しく言うように、内部表現は、年の 12 か月を表す 0-11 から表されます。それの人間の解釈は、年の 1-12 か月です。format 操作を呼び出すと、実際の人間のカレンダーでの日付の表示方法が得られます。これは、今年の 10 月の October です。内部表現は9のままです。 方法を尋ねると、APIを使用して確認できます

gc.setTimeInMillis(dateTimeObj.getMillis());
System.out.println(gc.get(Calendar.MONTH));

これは数字を印刷します9

date の内部表現が必要な場合は、それも可能です。本当にハックな方法は次のとおりですが、私はそれを保証しませんが、物事の全体的なアイデアを提供します.

LocalDate localDate = new LocalDate();
DateTime dateTimeObj = localDate.toDateTimeAtStartOfDay();
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(dateTimeObj.getMillis());
System.out.println(gc.get(Calendar.DAY_OF_MONTH) +"-"+ ("00"+ gc.get(Calendar.MONTH)).substring(1)  +"-"+gc.get(Calendar.YEAR));
于 2016-10-14T03:54:50.670 に答える