วิธีการแปลงนาโนวินาทีเป็นวินาทีโดยใช้ TimeUnit enum


145

วิธีการแปลงค่าจาก nanoseconds เป็นวินาที?

นี่คือส่วนรหัส:

import java.io.*;
import java.util.concurrent.*; 
..

class Stamper { 

public static void main (String[] args) { 
long start = System.nanoTime(); 
//some try with nested loops 
long end = System.nanoTime(); 
long elapsedTime = end - start;

System.out.println("elapsed: " + elapsedTime + "nano seconds\n");

//convert to seconds 
TimeUnit seconds = new TimeUnit(); 
System.out.println("which is " + seconds.toSeconds(elapsedTime) + " seconds"); 
}}

ข้อผิดพลาดคือ

Stamper.java:16:  enum types may not be instantiated.

สิ่งนี้หมายความว่า?


4
ข้อผิดพลาดหมายความว่าคุณไม่สามารถสร้างอินสแตนซ์ของประเภทTimeUtilได้เนื่องจากเป็นenum(ตัวระบุ) หากคุณต้องการใช้TimeUnitคุณควรใช้TimeUnit.NANOSECONDS.toSeconds(elapsedTime)แทน โชคดี!
Daniel Kvist

คำตอบ:


200

คุณสามารถหารด้วย 1,000,000,000:

long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;

หากคุณใช้TimeUnitการแปลงคุณจะได้ผลลัพธ์เป็นเวลานานดังนั้นคุณจะสูญเสียความแม่นยำทศนิยม แต่ยังคงความแม่นยำของจำนวนทั้งหมด


78
แต่ถ้าจำนวนนาโนวินาทีในการเปลี่ยนแปลงครั้งที่สองล่ะ? : P
geofftnz

9
คำตอบนี้ผิดตอนนี้convert()และtoFoo()วิธีการทั้งหมดกลับมาlongตอนนี้docs.oracle.com/javase/6/docs/api/java/util/concurrent/ …
Riking

3
@mbarrows แต่คำตอบนี้ยังคงมีสิทธิในการที่TimeUnitผลการแก้ปัญหาการสูญเสียความจำเพาะ TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);จะกลับมาไม่ได้0 0.5มันก็ขึ้นอยู่กับการใช้งานของคุณซึ่งสิ่งเหล่านี้เป็นที่นิยม
รู

17
เห็นด้วยอย่างละเอียดกับ @nbrooks ที่นี่ การใช้ TimeUnit จะไม่ส่งออกเศษเสี้ยวของวินาทีแทนที่จะส่งกลับ 0 หากคุณไม่ต้องการใช้หมายเลข 10 หลักแบบฮาร์ดโค้ดให้ใช้สิ่งเช่น 1E9 ตัวอย่างเช่นdouble seconds = ((double) nanoseconds) / 1E9; ฉันจะทำสิ่งนี้ทุกครั้งตามความชอบส่วนตัว
TechTrip

3
ใช้วิธีนี้เหนือเมธอด TimeUnit Enum หากคุณต้องการเศษเสี้ยวของวินาที การใช้ TimeUnit Enum ไม่ได้ปัดเป็นวินาทีที่ใกล้ที่สุด แต่ก็แค่ตัดเศษส่วนของวินาที ดังนั้น 4.9999999 จะเท่ากับ 4
Dick Lucas

354

TimeUnit enum

นิพจน์ต่อไปนี้ใช้TimeUnitenum (Java 5 และใหม่กว่า) เพื่อแปลงจากนาโนวินาทีเป็นวินาที:

TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)

14
ไม่ใช่ว่าวิธีนี้ไม่รวมเศษส่วนของวินาที 4.9999999 ดังนั้นก็แค่ 4 วินาที
Dick Lucas

1
สิ่งนี้เป็นที่ต้องการเพราะคุณไม่ควรเขียน 1 แล้วตามด้วยระเบียบทั้งหมดของ 0 เนื่องจากมีข้อผิดพลาดเกิดขึ้นได้ง่ายมาก
demongolem

1
คุณสามารถเขียนได้เช่นนี้ elapsedTime = (end_time - start_time) / 1e9;
Hasson

1
ถ้าฉันอยู่ 59 นาทีและ 50 วินาทีมันก็ยังบอกว่า 0 ชั่วโมงผ่านไป ... ซึ่งไม่เหมาะ มีวิธีใดบ้างที่จะทำให้วิธีนี้ใช้ได้กับเศษส่วน
user1156544

58

TimeUnit เป็น enum ดังนั้นคุณจึงไม่สามารถสร้างใหม่ได้

ต่อไปนี้จะแปลง 1000000000000ns เป็นวินาที

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
ฉันเชื่อว่ามันคือ 10e + 9 ไม่ใช่ 1e + 12!
Adam Arold

8
นี่เป็นคำตอบที่ค่อนข้างช้า แต่ตัวเลขในตัวอย่างไม่ใช่จำนวนของ nanos ในเสี้ยววินาทีมันเป็นเพียงตัวเลขที่จะแปลง แนวคิดทั้งหมดไม่จำเป็นต้องรู้คุณค่าเหล่านั้น
Nick Veys

2
ฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้ การใช้ toXxx () นั้นดีกว่าการใช้การแปลง () เพราะด้วยการแปลง () มันไม่ชัดเจนว่าทิศทางการแปลงจะเกิดขึ้นในขณะที่ใช้ toXxx ()
Klitos Kyriacou

21

หากต้องการลดรายละเอียดคุณสามารถใช้การนำเข้าแบบคงที่

import static java.util.concurrent.TimeUnit.NANOSECONDS;

- และต่อจากนี้ไปเพียงแค่พิมพ์

NANOSECONDS.toSeconds(elapsedTime);

6

คุณควรเขียน:

    long startTime = System.nanoTime();        
    long estimatedTime = System.nanoTime() - startTime;

การกำหนด endTime ในตัวแปรอาจทำให้เกิดนาโนวินาทีสองสาม ในวิธีการนี้คุณจะได้รับเวลาที่แน่นอน

แล้ว:

TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)

4

วิธีนี้จะแปลงเวลาเป็นวินาทีในรูปแบบสองเท่าซึ่งมีความแม่นยำมากกว่าค่าจำนวนเต็ม:

double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.