2012-04-09 28 views
11

Tôi có một giá trị trong cột thuộc loại dấu thời gian. Hãy nói tôi có một giá trị 2007/05/04 08: 48: 40,969774Cách in thời gian tới 6 chữ số chính xác cho giá trị giây

Bây giờ, khi cố gắng lấy giá trị từ cơ sở dữ liệu và trả lại giá trị timestamp này cho một chức năng, những gì SimpleDateFormatter mẫu tôi nên sử dụng để phần phân số bên cạnh các giây cũng được trả về.

Tôi đã sử dụng yyyy-MM-dd hh: mm: ss, nhưng chỉ trả về cho đến giây và bỏ qua phần hiện diện bên cạnh giây (.969774). Tôi cũng cần trợ giúp trong việc trả lại phần phân số này, với độ chính xác 6 chữ số.

+2

Hãy xem tài liệu: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html. Có một danh sách các bộ định dạng định dạng ở đó. –

+1

bất cứ ai được chăm sóc để được giải thích lý do tại sao? Không có gì sai với câu hỏi. Có thể nhận được độ chính xác thứ hai triệu trong java không. –

+2

+1 Tôi nghĩ đó là một câu hỏi hợp lý. Tôi tưởng tượng downvoter đã không nhận ra rằng đối phó với micro giây một) không phải là tầm thường hoặc b) khá có thể. –

Trả lời

6

Cách mặc định định dạng java.util.Date (hoặc java.sql.Timestamp) chỉ có độ chính xác đến mili giây. Bạn có thể sử dụng yyyy-MM-dd hh:mm:ss.SSS để nhận được độ chính xác mili giây đó.

A java.sql.Timestamp thực sự có (tối đa) độ chính xác nano giây (giả sử máy chủ cơ sở dữ liệu và trình điều khiển thực sự hỗ trợ nó). Cách dễ nhất để định dạng nó trong Java 8 là chuyển đổi dấu thời gian thành một số java.time.LocalDateTime (sử dụng Timestamp.toLocalDateTime()) và sử dụng các tùy chọn định dạng java.time trong java.time.format.DateTimeFormatter hỗ trợ tối đa nano giây.

Nếu bạn sử dụng Java 7 hoặc phiên bản cũ hơn, nó sẽ mất thêm chút công sức, vì các trình định dạng ngày bình thường không hỗ trợ nó. Ví dụ: bạn có thể sử dụng trình định dạng ngày với mẫu yyyy-MM-dd hh:mm:ss (chỉ định dạng tối đa giây) và nối thêm nano giây phụ (với số không đệm thích hợp) của số Timestamp.getNanos().

+0

chính xác, tôi đã thử nó với SSS tại kết thúc và im nhận được nó cho đến mili giây chính xác. Nhưng tôi muốn độ chính xác thứ hai triệu. Bất kỳ đề xuất? Trước hết, có thể với JAVA –

2

Bạn phải có cách lấy dấu thời gian vi giây. Tôi sử dụng System.currentTimeMillis() với System.nanoTime() kết hợp. Sau đó, bạn cần một cách để hiển thị nó. Bạn có thể chia nó cho 1000 và hiển thị mili giây như bình thường, sau đó hiển thị 3 chữ số cuối cùng của thời gian. tức là có một lúc nào đó cũng giống như

long timeUS = System.currentTimeMillis() * 1000 + micros; 

đây là một ví dụ chi tiết hơn

HiresTimer.javaHiresTimerTest.java

in Thử nghiệm

2012/04/09T14:22:13.656008 
2012/04/09T14:22:13.656840 
2012/04/09T14:22:13.656958 
2012/04/09T14:22:13.657066 
.... 
2012/04/09T14:22:13.665249 
2012/04/09T14:22:13.665392 
2012/04/09T14:22:13.665473 
2012/04/09T14:22:13.665581 

EDIT: Mã liên quan là

private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ss.SSS"); 
private static final DecimalFormat DF = new DecimalFormat("000"); 

public static String toString(long timeUS) { 
    return SDF.format(timeUS/1000) + DF.format(timeUS % 1000); 
} 
+7

'System.nanoTime()' không trả về một giá trị có bất kỳ tương quan nào với thời gian tuyệt đối. Nó chỉ hữu ích để đo thời gian trôi qua giữa hai lần gọi của 'System.nanoTime()'. http://stackoverflow.com/q/1712205/260633 – Dev

+0

Và nó có thể đo thời gian trôi qua từ currentTimeMillis có nghĩa là bạn có thể có một ý tưởng công bằng những gì các micro giây. –

+0

'System.nanoTime()' không thể đo bất cứ điều gì ngoại trừ thời gian trôi qua kể từ lần gọi cuối cùng đến 'System.nanoTime()'. Kỷ nguyên là không xác định. Vì vậy, nó chỉ hữu ích so với chính nó. – Dev

1

Xử lý nano giây trong Java không phải là tầm thường. Tôi không thể nhìn thấy bất kỳ giải pháp thanh lịch khác hơn là đối phó với họ theo một cách riêng biệt (ngày định dạng và thời gian với SimpleDateFormat và nano giây với DecimalFormat), ví dụ, như trong ví dụ sau:

 

package test; 

import java.sql.Timestamp; 
import java.text.DateFormat; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 


public class Main { 

    public static void main(String[] args) { 
    Main m = new Main(); 
    m.start(); 
    } 

    private void start() { 
    long time = System.currentTimeMillis(); 
    Date d = new Date(time); 
    Timestamp t = new Timestamp(time); 
    t.setNanos(123456789); 
    System.out.println(d); 
    System.out.println(t); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'"); 
    NumberFormat nf = new DecimalFormat("000000000"); 
    System.out.println(df.format(t.getTime()) + nf.format(t.getNanos())); 
    } 
} 
 

Sản lượng sản xuất là (trong đất nước của tôi, miền địa phương của tôi):

 
Mon Apr 09 16:27:27 CEST 2012 
2012-04-09 16:27:27.123456789 
2012-04-09 16:27:27.123456789 
+0

Vấn đề là vi/nano giây luôn bằng không. –

+0

Tôi cho rằng chúng có thể được thiết lập bởi hệ thống con cơ sở dữ liệu (theo câu hỏi). Tôi đã chỉnh sửa mã để chứng minh rằng ... –

+0

Thực ra, Câu hỏi liên quan đến micro giây không phải là nano giây. –

2

Trong Java 8 và sau đó, gói java.time đã hỗ trợ để phân tích và thao tác ngày/lần để nanosecond chính xác. Điều đó có nghĩa là tối đa 9 chữ số trong phần nhỏ của giây.

+1

Bạn có thể cung cấp và ví dụ không? – Jason

Các vấn đề liên quan