Bắt những người khác không có thời gian trong Java trong Java


258

Date.getTime () trả về mili giây kể từ ngày 1 tháng 1 năm 1970. Unixtime là giây kể từ ngày 1 tháng 1 năm 1970. Tôi thường không viết mã trong java, nhưng tôi đang làm việc với một số sửa lỗi. Tôi có:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Có cách nào tốt hơn để có được unixtime trong java không?


27
Vì bạn đã chuyển nó thành int, bạn đã giới thiệu vấn đề năm 2038 (tương đương với Y2K cho Unix). Đó là khi Unix epoch đạt 2 tỷ và chuyển sang tiêu cực. Cách khắc phục là chuyển sang Unix 64 bit. Tương đương với Java là để nó dài.
John M

1
Vâng, tôi nhận thức được điều đó. Mã mà giao diện này đang mong đợi một int 32 bit cho unixtime.
Gary Richardson

157
2038 sẽ đến sớm.
Pacerier

Có một tên hoặc tiêu chuẩn thích hợp cho currentTimeMillis không? Tôi có xu hướng coi nó trong tài liệu của mình là phiên bản mili giây của thời gian UNIX.
Tom

1
Nếu bạn muốn phần mềm của bạn tồn tại tràn, hãy sử dụng long, không int. Thực sự không có lý do để sử dụng intdấu thời gian, trừ khi bạn đang sử dụng mức độ chi tiết khác nhau như 1 giây = 4 giây, v.v. Hoặc là, hoặc ẩn mã của bạn để các thế hệ tương lai không thể thấy bạn bất tài như thế nào.
bryc

Câu trả lời:


475

Tránh việc tạo đối tượng Date w / System.cienTimeMillis () . Một chia cho 1000 sẽ đưa bạn đến Unix epoch.

Như đã đề cập trong một nhận xét, bạn thường muốn một đối tượng nguyên thủy dài (chữ thường-dài) không phải là một đối tượng được đóng hộp dài (chữ hoa dài L) cho kiểu của biến unixTime.

long unixTime = System.currentTimeMillis() / 1000L;

3
Ngoài ra, hãy cân nhắc sử dụng dài nguyên thủy thay vì tự động chuyển sang Long, trừ khi bạn muốn xử lý số này dưới dạng Đối tượng (như đưa nó vào Bộ sưu tập), một lần nữa tránh việc tạo đối tượng không cần thiết
brabster

9
Java 32 bit int khớp với các nền tảng 32 bit (và vấn đề năm 2038). Nền tảng 64 bit sử dụng kiểu dữ liệu time_t lớn hơn. Java đã tránh được viên đạn đó bằng cách sử dụng một khoảng thời gian trả về cho System.cienTimeMillis (). Nếu bạn chuyển đổi sang int, bạn sẽ giới thiệu lại vấn đề năm 2038. Xem en.wikipedia.org/wiki/Year_2038_probols#Solutions
John M

1
Tôi nghĩ rằng bạn đã nhầm ở một điểm: Không có sự khác biệt giữa chữ thường "L" và chữ hoa khi sử dụng chúng trong các chữ số như thế này. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe

5
Các cuộc thảo luận viết hoa (được làm rõ ở trên) là về kiểu dữ liệu. Ví dụ lớp "dài" so với "java.lang.Long". Bạn đang nói về chữ cái hậu tố trên chữ dài, mà tôi đồng ý có thể viết hoa hoặc viết thường. Mặc dù chữ thường "l" trông có vẻ rất giống chữ số "1", vì vậy việc sử dụng chữ "L" dễ đọc hơn nhiều.
John M

1
Nhấp vào liên kết đến tài liệu. Trả về được định nghĩa là số mili giây kể từ 1/1/1970 trong múi giờ UTC. Bạn muốn múi giờ? Nhìn vào java.util.CalWiki.
John M

273

Java 8 đã thêm một API mới để làm việc với ngày và giờ. Với Java 8, bạn có thể sử dụng

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()trả về một Instant thể hiện thời gian hệ thống hiện tại. Với getEpochSecond()bạn có được giây epoch (thời gian unix) từ Instant.


4
Sự khác nhau giữa là gì Instant.now().getEpochSecond(), new Date().getTime()System.currentTimeMillis()
SohamC

2
Một điểm khác biệt là cái trước tính bằng giây trong khi hai cái sau tính bằng mili giây. Có thể có hoặc không có người khác.
super_aardvark

3
import java.time.Instantnếu bạn ở Scala
akauppi

4
Kiểm tra trang web này để biết mô tả chi tiết ... Thích nó .. currentTimeMillis
Subroto

1
Lưu ý rằng bạn không thể sử dụng phương pháp này với các cấp API Android cũ hơn.
Ali Nadalizadeh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.