gpt4 book ai didi

java - 特定时区日历中的日期 getTime()

转载 作者:行者123 更新时间:2023-12-02 05:33:44 30 4
gpt4 key购买 nike

我有下面的代码:

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 如何从纪元返回毫秒,但我希望它会从我从日历中询问的日期的纪元返回毫秒。

当我在罗马时间 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();
}

当我说返回我向日历询问的日期的毫秒时,我的意思是,如果日历提供了8月7日晚上11:30(因为我提供了时区),那么我预计从纪元到 8 月 7 日 11:30 的毫秒数会针对该时区进行调整。这是一个错误的期望吗?

最佳答案

I have read how Date returns the Millis from the Epoch but I would expect that it would return the millis from the Epoch of the date I ask from the Calendar.

那么您的期望是不正确的 - 或者您没有清楚地表达您的期望。只有一个 Unix 纪元:UTC 午夜。 Date 没有时区的概念 - 它只是自 Unix 纪元以来的毫秒数。

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

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

关于java - 特定时区日历中的日期 getTime(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25249615/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com