2014-12-02 411 views
-2

如何將以下python代碼轉換爲Java?如何將python time.time()轉換爲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

你到底意思是「不同的結果」?請舉例。另外請注意,您當前的Java代碼不會編譯......除非您試圖詢問編譯時失敗,否則始終值得提供有效的代碼。 – 2014-12-02 10:08:22

+0

@JonSkeet我已經改正並改進了問題,如果它讓你更快樂。但提供的第一個答案爲我工作。不管怎麼說,多謝拉。 – nmvictor 2014-12-02 10:27:03

+0

接受的答案實際上並不能解釋*差異。我會添加一個額外的答案。請閱讀http://tinyurl.com/stack-hints - 僅僅因爲你有一個你喜歡的答案而沒有問一個體面的問題並不意味着這是一個好主意。一般來說,問題越好,答案就越好。 – 2014-12-02 11:01:16

回答

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); 
} 

(目前還不清楚爲什麼你需要這是擺在首位的字符串,但是這是一個不同的問題。)

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

這是不同之處在於在Python你得到16位幾乎相同(10 time.time()+ 6後的小數點後面的十進制數字)在java中,您可以獲得13位數字。您的等效代碼將爲

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

謝謝,你的解決方案工作。此外,感謝您足夠聰明,知道我在尋找什麼,而不會打擾我的問題的正確性。 – nmvictor 2014-12-02 10:25:14

+0

歡迎您:) – SMA 2014-12-02 10:25:52