2014-12-02 2 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 

Любой один с лучшим подходом? Как time.time() в python отличается от System.currentTimeInMillies() в Java?

+3

Что именно вы означает «разные результаты»? Приведите примеры. Также обратите внимание, что ваш текущий Java-код не будет компилироваться ... всегда стоит указать действительный код, если вы не попросите о сбое во время компиляции. –

+0

@JonSkeet Я исправил и улучшил вопрос, если он сделает вас счастливее. Но первый ответ предоставил мне работу. В любом случае спасибо. – nmvictor

+0

Принятый ответ на самом деле не объясняет * разницу. Я добавлю дополнительный ответ. Пожалуйста, прочитайте http://tinyurl.com/stack-hints - только потому, что вы получили ответ, который вам нравится, не задавая достойного вопроса, это не значит, что это хорошая идея. В общем, чем лучше вопрос, тем лучше будут ответы. –

ответ

1

Два значения, которые вы получаете, очень похожи - это просто, что представления различны. Это связано прежде всего с тем, что в версии Java вы умножаетесь на 1e6, который является литералом с плавающей точкой, поэтому результатом является double, который представляется в научной нотации из-за его размера. Python немного свободен с его числовыми типами и предпочитает отображать результат без использования научной нотации.

Если вместо этого вы умножаетесь на целочисленный литерал 1000000, вы получите что-то вроде "1417515400000000" - который выглядит ближе к версии Python, но усечен ко второму.

Если вместо деления на 1000, а затем умножения на 1 000 000 вы всего, умноженного на 1000, вы получите что-то более похожее на "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

Это почти то же самое, за исключением того, в питона вы получаете 16 цифр (10 цифры до десятичного по времени. time() + 6 после десятичного), а в java - 13 цифр. Ваш эквивалентный код будет

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

Спасибо, ваше решение сработало. Кроме того, спасибо за то, что вы достаточно умны, чтобы знать, что я искал, не беспокоясь о правильности моего вопроса. – nmvictor

+0

Добро пожаловать :) – SMA

Смежные вопросы