0

我写了两个函数 -today()todayUTC()- 作为:

public static Date today() {
  Calendar cal = Calendar.getInstance();
  return cal.getTime();
}

public static Date todayUTC() {
  Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
  return cal.getTime();
}

但是当我使用以下方法打印这些函数的结果时:

public void todayTest() {
  Date date1 = OOTBFunctions.today();
  System.out.println("today: "+date1);

  Date dateUTC1 = OOTBFunctions.todayUTC();
  System.out.println("todayUTC: "+dateUTC1);
}

我看到两个语句都打印相同的值,即

today: Thu Aug 30 14:48:56 PDT 2012
todayUTC: Thu Aug 30 14:48:56 PDT 2012

任何人都可以建议我在获取本地时区日期的 UTC 函数中缺少什么。

4

2 回答 2

3

Java 在打印时使用默认区域设置,这就是您看到该行为的原因。使用如下代码格式化并以您想要的语言环境/格式打印。记住

  • 创建 Date 对象时,它始终采用 UTC。
  • 在用户的区域设置中显示日期。
  • 以 UTC 格式存储日期。

代码

final SimpleDateFormat sdf = new SimpleDateFormat("the format you want");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
final String utcTime = sdf.format(new Date());

您不需要 today() 和 todayUTC() 方法。保持并喜欢下面

public static Date nowInUTC() 
{
  return new Date();
}

你不需要测试任何东西。

于 2012-08-30T22:03:52.780 回答
0

您的两种方法都将返回相同的值 -Date对象没有任何时区概念(与 a 不同Calendar)。ADate 表示时间的瞬间,内部存储为自 UTC 时间 1970 年 1 月 1 日午夜以来的毫秒数。实际上,您有两种方法等效于:

return new Date(System.currentTimeMillis());

Date.toString()始终使用系统默认时区。

如果您想使用时区维护日期/时间,请考虑仅使用Calendar. 如果要在时区中格式化特定时刻,只需使用SimpleDateFormat设置时区。

理想情况下,改为使用Joda Time代替DateCalendar虽然 - 这是一个更清洁的 API。

于 2012-08-30T22:07:36.120 回答