【发布时间】:2016-04-12 20:34:51
【问题描述】:
假设我有一个时间戳值。
编辑
Calendar curCal = new GregorianCalendar(TimeZone.getDefault());
curCal.setTimeInMillis(System.currentTimeMillis());
TimeZone fromTz = TimeZone.getDefault();
curCal.setTimeZone(fromTz);
TimeZone gmtTZ = TimeZone.getTimeZone("GMT");
Calendar toCal = new GregorianCalendar(gmtTZ);
toCal.setTimeInMillis(curCal.getTimeInMillis());
Date dd = toCal.getTime();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a",Locale.US);
format.setTimeZone(gmtTZ);
String ff = format.format(dd);
java.sql.Timestamp curTimeInGMT = new java.sql.Timestamp(dateInLong(ff, "dd/MM/yyyy hh:mm:ss a"));
现在我正在使用getTime() 获取上述时间的毫秒值;
Long l = t.getTime();
根据 Java 文档对 getTime() 方法的定义是
Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Timestamp object.
因此,根据我通过多次测试了解到的情况,getTime() 将给出给定时间与 1970 年 1 月 1 日 00:00:00 GMT 之间的毫秒差。
对于getTime(),要获得与 1970 年 1 月 1 日 00:00:00 GMT 的差异,它需要另一个 GMT 时间。
因此,它需要将给定时间转换为 GMT 时间。对于该转换,它需要给定时间的时区。
它将给定时间的时区视为SYSTEM TIME ZONE,它会得到对应的GMT时间,然后它会找到两个GMT时间之间的差异,并返回差异。
我的理解正确吗?
【问题讨论】:
-
您显示的不是时间戳,而是时间戳的字符串表示形式……答案完全取决于您如何创建实际的时间戳。
-
为了理解,我只是将存储在表中的时间戳值复制到这里。
-
什么表?在数据库表中?数据库列的类型是什么?等等。您需要提供更多信息...
-
阅读此代码片段让我对您想要实现的目标有些困惑。您将
Timestamp变量命名为curTimeInGMT- 这是一种误导,因为它独立于任何时区。只有当您将时间值与字符串相互转换时,时区才会发挥作用,因为同一时刻根据相关时区的名称不同。当向/从数据库保存/检索值并在前端和后端(例如服务)之间传递它们时会出现类似的问题,因为源可能与目的地使用的时区不同(待详细说明)。