unix date命令和java simpledateformat中的差异

时间:2014-06-23 02:55:19

标签: java unix

如果我正在运行unix命令

echo 1378223625 | xargs -L 1 -I '{}' date -d "@{}" "+%d-%m-%Y-%H-%M %Z"

结果为03-09-2013-17-53 CEST

如果我从java运行

public class DateExperiment {
    public static void main(String[] args) {
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy-H-m z");
        System.out.println(df.format(1378223625) );
    }
}

我的结果是16-01-1970-23-50 CET

unix命令给出了正确的结果,但是java给了我错误的结果。

有人可以解释为什么会出现这种差异吗?这是什么错误?

2 个答案:

答案 0 :(得分:3)

如果您使用数值作为SimpleDateFormat#format(..)的参数,则使用Date constructor which expects a long。那个构造函数

  

分配Date对象并初始化它以表示指定的对象   自标准基准时间以来称为“。”的毫秒数   时代“,即1970年1月1日,格林尼治标准时间00:00:00。

您提供的值代表

16-01-1970-23-50 CET

这里的问题是你有秒,而不是毫秒。

你想要

System.out.println(df.format(1378223625000L));

答案 1 :(得分:2)

Unix为你提供了自纪元以来几秒钟的时间,Java需要几毫秒。如果我乘以1000,我得到你的预期输出。

System.out.println(df.format(1378223625*1000L));

输出

03-09-2013-11-53 EDT