1

我想将 org.joda.time.LocalDate 对象转换为 java.util.GregorianCalendar。java.util.GregorianCalendar 月份从索引 0 到 11 显示。所以十月用数字 9 表示,十一月用数字 10....而对于 LocalDate 十月用数字 10 表示,十一月用数字 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 十月月份用数字 9 表示)。

PS:java5是我使用的版本。

4

3 回答 3

1

我认为您不能直接使用 SimpleDateFormat 来格式化公历日期。我有两个建议可以解决:

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

如果我理解正确的问题,我们正在混合两件事

a) Calender / GregorianCalender 和实际日历本身中月份的内部表示。

正如你所说的,内部表示是从 0-11 表示的,表示一年中的 12 个月,人类对此的解释是一年中的 1-12 个月。当您调用格式操作时,您会看到日期出现在实际人类日历上的方式,即十月,一年中的第 10 个月。内部表示仍然是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 回答