讨论了太多次,我知道,但我不明白为什么我的产生的毫秒数:
System.currentTimeMillis();
或通过:
Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()
不等于我在 www.epochconverter.com 上看到的?
我只需要生成一个具体格式的String
,但我发现毫秒数不对。
为了以防万一,我是这样做的:
private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public static String getCurrentTimestamp() {
long time = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
String lastModifiedTime = sdf.format(time);
Logger.logVerbose(TAG, "Generated timestamp is " + lastModifiedTime);
return lastModifiedTime;
}
我最终得到的只是一个本地时间,但我需要唯一一个不与我的时区相结合的纯 UTC 时间。
我什至用 SQLite 检查了它(使用 SELECT strftime('%s',timestring);
)并得到了正确 毫秒。为什么我上面发布的那两个语句错误地生成了它?非常感谢。
最佳答案
需要考虑的三件事
- Java 不支持带闰秒的 UTC,仅支持 GMT。这是因为操作系统不支持它。
- 除非您使用卫星同步设备获取时间,否则您的毫秒数将不准确。
- 您不能在完全相同的时间运行命令,因此它们有时会不同。
但更重要的是,如果您不设置时区,它将使用默认时区。
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
// no time zone set so the default is used.
String lastModifiedTime = sdf.format(time);
相反,你应该添加
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
在格式中添加 'Z'
只会更改时区,与在格式中添加 'T'
一样,它只是您添加的一个字母。
关于java - 为什么 System.currentTimeMillis() 生成不正确的 long 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139600/