首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.Calendar和timeZones的问题

java.util.Calendar和timeZones的问题
EN

Stack Overflow用户
提问于 2012-04-24 17:37:15
回答 3查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
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时区本地运行。

根据上述输入,打印以下输出。

代码语言:javascript
复制
Tue Apr 24 14:43:07 IST 2012

Tue Apr 24 09:30:00 IST 2012

所以正如你所看到的,在最后一次输出中,时间没有被归零。有什么建议吗?

@Marko,是的,我开始了解DateFormat,并尝试了下面的例子。但静态日期打印的是时间,而不是归零。

代码语言:javascript
复制
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()));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-24 17:55:28

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-24 17:44:30

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

票数 2
EN

Stack Overflow用户

发布于 2012-04-24 17:58:15

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

当你向Calendar询问时间时,它会将日期转换为你想要的时区,因此产生了差异。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10295311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档