【发布时间】:2016-04-16 01:46:55
【问题描述】:
所以我将代码从 PHP 移植到 Java。部分代码具有时间敏感的散列算法,其中当前的 Unix 时间戳充当种子。我遇到了一个问题,即我的移植代码在任何一种语言中都给了我不同的答案。我怀疑这可能是在实施或其他方面略有不同。
我想知道这个问题是不是有点晦涩难懂,例如this。尽管如此,任何帮助将不胜感激。
这是我的 Java 代码。
private static int generateB() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US);
Date start;
Date now;
try {
start = sdf.parse("01/01/1970");
now = new Date();
} catch (ParseException e) {
return 402890;
}
long diff = now.getTime() - start.getTime();
long hours = diff / (60 * 60 * 1000) % 24;
long days = diff / (24 * 60 * 60 * 1000);
return (int) (hours + days * 24);
}
这里是 PHP 代码:
/**
* Generate "b" parameter
* The number of hours elapsed, since 1st of January 1970
*
* @return int
*/
private function generateB()
{
$start = new \DateTime('1970-01-01');
$now = new \DateTime('now');
$diff = $now->diff($start);
return $diff->h + ($diff->days * 24);
}
但它们返回不同的结果,确切地说是 3 小时。
在发这篇文章的时候。 PHP 返回 403472,而 Java 返回 403475。另外,如果我使用 System.currentTimeMillis(),我得到 403480。
所以我的问题是为什么有任何区别?我的意思是减去 3 可以解决我的问题,但我只是对未来的参考感到好奇,为什么存在差异。注意:出于测试目的,我通过 PHP Sandbox 运行 PHP。
【问题讨论】:
-
你的时区是什么时候?如果我记得的话,Java 时间戳总是采用 UTC 时间。
-
在 Java 代码中,您通过事物的外观明确定义时区(我不太了解 Java),但在 php 代码中,
DateTime调用未指定时区。我相信纪元时间是格林威治标准时间。 -
这绝对是一个确切的小时数吗?您是否检查了确认的毫秒数?如果是的话,我猜时区会有所不同。
-
听起来肯定是 TZ 问题。对于 PHP:回显日期(“Z”); //TZ 以秒为单位的偏移量 echo date("T"); // TZ 名称,例如“CST”回显日期(“e”); // “美国/芝加哥”。
-
对于 Java,我建议使用
System.currentTimeMillis(),因为无论您当前的时区如何(假设您的计算机配置正确等),它都会返回自1970-01-01 00:00:00Z以来的毫秒数。不要费心解析01/01/1970,因为这会给你所在时区的午夜。 ETA:另外,不要费心打破几个小时和几天。总小时数仅为diff / (60 * 60 * 1000)。无需单独进行 mod 24 或数字天数。
标签: java php time locale porting