2011-01-20 30 views
8

Tôi cần một hàm như getMillis dài (Ngày aDate);getMilliseconds() trong Java Date

trả về mili giây của Ngày thứ hai. Tôi không thể sử dụng Yoda, SimpleDateFormat hoặc các thư viện khác vì nó là mã gwt.

Giải pháp hiện tại của tôi đang thực hiện date.getTime() % 1000

Có cách nào tốt hơn không?

+6

Có vấn đề gì với giải pháp hiện tại của bạn? Co vẻ tôt vơi tôi. – spender

+0

Tôi sẽ làm như bạn đã làm. Có vẻ là một cách khá tự nhiên khi làm việc. Tôi không chắc chắn 100%, nhưng độ chính xác của đồng hồ của máy tính có thể thay đổi (vì vậy bạn có thể không phải chi tiết đến mức-ms trong tất cả các trường hợp. – Romain

+1

@Harry Đó là javascript – marcog

Trả lời

6

Như đã chỉ bởi Peter Lawrey, nói chung bạn cần một cái gì đó giống như

int n = (int) (date.getTime() % 1000); 
return n<0 ? n+1000 : n; 

từ % công trình một cách "kỳ lạ" trong Java. Tôi gọi nó là lạ, như tôi luôn luôn cần kết quả để rơi vào một phạm vi nhất định (ở đây: 0,999), thay vì đôi khi nhận được kết quả tiêu cực. Thật không may, nó hoạt động theo cách này trong hầu hết các CPU và hầu hết các ngôn ngữ, vì vậy chúng ta phải sống với nó.

+1

Làm thế nào là% "lạ" trong Java? Nó khá tiêu chuẩn IMO ... – Romain

+0

Gỡ bỏ tuyên bố về: "%" là lạ . Rollback nếu bạn thực sự muốn nói điều đó. – jzd

+0

Đồng ý: đó là tiêu chuẩn. Tuy nhiên, tiêu chuẩn bị hỏng, vì đối với số âm, nó hiếm khi làm những gì bạn cần. Lấy câu hỏi này làm ví dụ cho nơi bạn cần kết quả để luôn nằm trong khoảng 0..999. Có ví dụ nào bạn cần kết quả âm tính không? Tôi nghi ngờ điều đó. – maaartinus

3

Đã thử nghiệm ở trên và có hành vi không mong muốn cho đến khi tôi sử dụng bản mod có độ dài 1.000.

int n = (int) (date.getTime() % 1000l); 
return n<0 ? n+1000 : n; 
+1

bạn có ví dụ về nó không? – rogerdpack

0

tl; dr

aDate.toInstant() 
    .toEpochMilli() 

java.time

Cách tiếp cận hiện đại sử dụng các lớp học java.time. Những cái này thay thế các lớp di sản cũ phiền hà như java.util.Date.

Instant instant = Instant.now(); // Capture current moment in UTC. 

Trích xuất số mili giây của bạn kể từ kỷ nguyên 1970-01-01T00:00:00Z.

Chuyển đổi

Nếu bạn đang thông qua một đối tượng java.util.Date, chuyển đổi sang java.time. Gọi các phương thức mới được thêm vào các lớp cũ.

Instant instant = myJavaUtilDate.toInstant() ; 
long millis = instant.toEpochMilli() ; 
Các vấn đề liên quan