如何将python time.time()转换为Java

时间:2014-12-02 10:06:34

标签: java python datetime

如何将以下python代码转换为Java?

import time
 str(int(time.time() * 1e6))

我在Java项目中尝试了以下代码段。

private static String runPython(String script) throws  Exception{
         File file = new File("test.py");
         if(file.exists()) {
             file.delete();
         }
         BufferedWriter out = new BufferedWriter(new FileWriter("test.py"));
         out.write(script);
         out.close();
         Process p = Runtime.getRuntime().exec("python test.py ");
         BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
         String ret = in.readLine();
         return  ret+"";

}
private static String getFromPython() {
    try {
         String prg = "import time\nprint str(int(time.time() * 1e6))\n";

         return  runPython(prg)+"";
     }catch(Exception e){
         e.printStackTrace();
     }
    return null;

}


public static String getFromJava() {
    String result = ((System.currentTimeMillis() / 1000) * 1e6)+"";
    return result;
}


public static void main(String[] args) {
    System.out.println("Python Version: "+getFromPython());
    System.out.println("Java Version: "+getFromJava());
}

这是我得到的不同结果

run:
Python Version: 1417515400105953
Java Version: 1.4175154E15

任何一个有更好方法的人? python中的time.time()与Java中的System.currentTimeInMillies()有什么不同?

3 个答案:

答案 0 :(得分:1)

等同于time.time()的是System.currentTimeMillis()/1000.0

相当于

str(int(time.time() * 1e6))

因此

String.valueOf((int) (System.currentTimeMillis() / 1000.0) * 1e6)

可以简化为

String.valueOf(System.currentTimeMillis() * 1000)

答案 1 :(得分:1)

它几乎相同,只是在python中你得到16位数字(十进制之前10位数字由time.time()+ 6位小数后)而在java中你得到13位数字。你的等效代码是

String result = (System.currentTimeMillis() * 1000) + "";

答案 2 :(得分:1)

您获得的两个值非常相似 - 只是表示形式不同。这主要是因为在Java版本中,您乘以1e6这是一个浮点字面值,因此结果是double,由于其大小,它以科学记数法表示。 Python的数字类型更加自由,并选择显示结果而不使用科学记数法。

如果你乘以整数文字1000000,你会得到像"1417515400000000"这样的东西 - 它看起来更接近Python版本,但被截断到第二个。

如果不是除以1,000然后乘以1,000,000,而乘以1,000,你就会得到更像"1417515400105000"的东西。这仍然被截断到毫秒,但我怀疑你的时钟不可能比这更准确。

顺便说一句,我建议使用String.valueOf(x)将非字符串类型转换为字符串而不是使用x + "" - 它更好地描述了您要做的事情,因为您真的根本不试图进行连接。所以我建议你的getValueFromJava方法应该是:

public static String getFromJava() {
    return String.valueOf(System.currentTimeMillis() * 1000);
}

(目前还不清楚为什么你首先需要这个字符串,但这是另一回事。)