在特定时区中从日历获取日期getTime()

时间:2014-08-11 18:03:37

标签: java date datetime

我的代码如下:

Date now = CalendarUtils.getCalendar(getDefaultTimeZone())
                .getTime();

CalendarUtils类具有以下方法

public static Calendar getCalendar(final TimeZone tz) {
    return getCalendar(CalendarUtils.getDate(), tz);
}

public static Calendar getCalendar(final Date time, final TimeZone tz) {
    final GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTimeZone(tz);
    calendar.setTime(time);
    return calendar;
}

public static Date getDate() {
    return CalendarUtils.getDate(System.currentTimeMillis());
}

getDefaultTimeZone()返回特定时区中的时区对象。让我们说欧洲/马德里。

但是我的应用程序正在罗马的服务器上运行。

问题是上面的代码用于获取马德里当地时间。所以8月8日上午12:30在罗马,8月7日晚上11:30在马德里。

当我使用

Date startOfDay = DateUtils.truncate(now, Calendar.DATE);

我希望8月7日00:00:00而不是8月8日00:00:00

我已经阅读过Date如何从Epoch返回Millis,但是我希望它会从我从日历中询问的日期回归毫秒。

当我在罗马时间8月8日上午12:30使用下面的查询时,利用两个日期(现在和startOfDay),我得到8月8日而不是7日(这是马德里当地时间)的结果。

 public BigInteger getSumForDates(Date fromDate, Date toDate) {

    Session session = sessionFactory.openSession();
    BigInteger sum;
    try{
        sum = (BigInteger)session
            .createSQLQuery(
                    "SELECT SUM(column) FROM table 
                     WHERE (column2 at time zone vas_tz()) >=:fromDate 
                   AND (column2 at time zone vas_tz()) < :toDate")
                  .setTimestamp("fromDate", fromDate)
                  .setTimestamp("toDate", toDate).uniqueResult();
    }catch (final HibernateException e){
        LOGGER.error(e.getMessage());
        throw new ProjectRuntimeException();
    }finally{
        session.close();

    }

修改

DateUtils来自package org.apache.commons.lang.time;

public static Date truncate(Date date, int field) {
    if (date == null) {
        throw new IllegalArgumentException("The date must not be null");
    }
    Calendar gval = Calendar.getInstance();
    gval.setTime(date);
    modify(gval, field, MODIFY_TRUNCATE);
    return gval.getTime();
}

当我说要回复毫升时我要求Calendar,我的意思是如果日历已经提供8月7日晚上11:30(因为我提供了一个时区),那么我希望从大纪元到8月7日11:30的时间调整为该时区。这是不正确的期望吗?

1 个答案:

答案 0 :(得分:2)

  

我已经阅读过Date如何从Epoch返回Millis,但是我希望它会从我从日历中询问的日期回归毫秒。

然后你的期望是错误的 - 或者你没有明确表达你的期望。只有一个Unix时代:它是午夜 UTC Date没有时区概念 - 它只是自Unix纪元以来的毫秒数。

目前尚不清楚您的DateUtils类是什么,但声称在未指定时区的情况下将Date截断为一天的任何内容都有些可疑。

强烈建议您使用Joda Time或Java 8 java.time类 - 它们 更容易使用{ {1}}。如果您必须使用java.util.*java.util.Date,则需要确定您感兴趣的时区,并使用java.util.Calendar正确指定 - 不是Calendar - 执行“截断到日期”等操作时。