2

我有以下方法将我的自定义 DMY(日期、月份、年份)对象转换为日期。

public static Date serverCreateDateFromDMY(DMY pDMY, TimeZone pTimeZone)
    {
        Calendar vCalendar = Calendar.getInstance(pTimeZone);
        vCalendar.set(Calendar.YEAR, pDMY.getYear());
            // Below line is because DMY month counts are 1-indexed
            // and Date month counts are 0-indexed
        vCalendar.set(Calendar.MONTH, pDMY.getMonthOfYear() - 1);
        vCalendar.set(Calendar.DAY_OF_MONTH, pDMY.getDayOfMonth());
        System.out.println(vCalendar.getTime());
        TimeUtilsServer.zeroCalendarHoursAndBelow(vCalendar);
        System.out.println(vCalendar.getTime());
        return vCalendar.getTime();
    }


public static void zeroCalendarHoursAndBelow(Calendar pToZero)
    {
        pToZero.set(Calendar.HOUR_OF_DAY, 0);
        pToZero.set(Calendar.MINUTE, 0);
        pToZero.set(Calendar.SECOND, 0);
        pToZero.set(Calendar.MILLISECOND, 0);
    }

到 serverCreateDateFromDMY() 方法,我传递了这些参数:DMY=20120424,TimeZone 是:America/New_York。应用程序在我的时区本地运行,即 IST。

基于上述输入,打印以下输出。

Tue Apr 24 14:43:07 IST 2012

Tue Apr 24 09:30:00 IST 2012

如您所见,在最后的输出时间没有归零。请问有什么建议吗?

@Marko,是的,我了解了 DateFormat 并尝试了以下示例。但是日期仍然打印有时间而不是归零。

TimeZone tz = TimeZone.getTimeZone("America/New_York");
        Calendar vCalendar = Calendar.getInstance(tz);
        vCalendar.set(Calendar.YEAR, 2012);

        vCalendar.set(Calendar.MONTH, 4 - 1);
        vCalendar.set(Calendar.DAY_OF_MONTH, 24);
        DateFormat df = DateFormat.getDateTimeInstance();
        df.setTimeZone(tz); 
        System.out.println(df.format(vCalendar.getTime()));

         vCalendar.set(Calendar.HOUR_OF_DAY,     vCalendar.getActualMinimum(Calendar.HOUR_OF_DAY));
        vCalendar.set(Calendar.MINUTE, vCalendar.getActualMinimum(Calendar.MINUTE));
        vCalendar.set(Calendar.SECOND, vCalendar.getActualMinimum(Calendar.SECOND));
        vCalendar.set(Calendar.MILLISECOND,   vCalendar.getActualMinimum(Calendar.MILLISECOND));
        System.out.println(df.format(vCalendar.getTime()));
4

3 回答 3

2

java Date/Time API 从创建之时起就有一个糟糕的设计。也许你应该看看一些库 - 例如隐藏 JDK API 缺陷的库 - http://joda-time.sourceforge.net/

于 2012-04-24T09:44:29.680 回答
2

在内部,日期和日历对象以 UTC 格式存储。当您将字段设置为 0 时,日历会以 UTC 进行更新。

当您向日历询问时间时,它会将日期转换为您想要的时区,从而产生差异。

于 2012-04-24T09:58:15.040 回答
1

...您比纽约时间早 9:30。您将时间设置为纽约时间午夜并将其读出为您所在区域的时间。请注意,getTime返回 a Date,它不是时区可配置的。如果要DateFormat指定打印结果的时区,则需要。

于 2012-04-24T09:55:27.663 回答