【问题标题】:Why is the Epoch time different between Java and PHP?为什么 Java 和 PHP 的 Epoch 时间不同?
【发布时间】: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


【解决方案1】:

根据您的报价判断

在发这篇文章的时候。 PHP 返回 403472,而 Java 返回 403475。另外,如果我使用 System.currentTimeMillis(),我得到 403480。

看起来一切正常 - PHP 和 Java 之间有 3 秒,除此之外还有 5 秒。我想这可能是您切换进程和运行测试所花费的时间?

php > echo date('Y-m-d H:i:s', 403472);
1970-01-05 17:04:32
php > echo date('Y-m-d H:i:s', 403475);
1970-01-05 17:04:35
php > echo date('Y-m-d H:i:s', 403480);
1970-01-05 17:04:40

【讨论】:

  • 再看代码。 OP 正在尝试计算自纪元以来的小时数,所以它不是三秒;三个小时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2011-10-30
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多