2010-06-22 43 views
6

Tôi cần tính toán java.util.Date để bắt đầu một ngày hôm nay (00:00:00 giờ sáng của ngày hôm nay). Có ai đó biết điều gì đó tốt hơn là đặt lại các trường của java.util.Calendar:Cách tính ngày cho 00:00:00 giờ sáng của ngày hôm nay?

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.AM_PM, Calendar.AM); 
cal.set(Calendar.HOUR, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
+0

Điều đó không quá tệ. –

+0

Nhưng tôi thích ngắn gọn ... – Nulldevice

+2

sau đó bọc nó trong một phương thức gọi là 'getTodayAtMidnight() ' –

Trả lời

7

Nếu bạn không bận tâm về múi giờ thì giải pháp của bạn là ok. Nếu không, nó là giá trị để xem xét JodaTime.

Nếu cuối cùng bạn quyết định chuyển sang JodaTime, thì bạn có thể sử dụng lớp DateMidnight được cho là sẽ được sử dụng trong trường hợp của bạn.

1

Tôi đang ở cùng một chiếc thuyền và những gì bạn đã cung cấp là cách tôi làm. Tôi có nó trong một chức năng DateUtil.stripToMidnight(...) ...

Nhưng hãy nhớ xem xét múi giờ khi làm tất cả điều này, như 0:00 sáng ở đây, sẽ không giống nhau ở một phần khác của thế giới.

Có thể có cách để thực hiện việc này trong JodaTime, nhưng tôi không biết.

0

Một tùy chọn khác mà không cần thư viện bổ sung:

import java.sql.Date; 

public class DateTest { 
    public static void main(String[] args) { 
     long MS_PER_DAY = 24L * 60 * 60 * 1000; 
     long msWithoutTime = (System.currentTimeMillis()/MS_PER_DAY) * MS_PER_DAY; 
     Date date = new Date(msWithoutTime); 
     System.out.println(date.toGMTString()); 
    } 
} 
+0

ngày không phải lúc nào cũng dài 24 giờ. (gợi ý: ngày tiết kiệm ánh sáng ban ngày) – Pac0

4

Các mã sau sẽ trở lại đối tượng lịch ngày hiện tại với thời gian như 00:00:00

Calendar current = Calendar.getInstance(); 
current.set(current.get(Calendar.YEAR),current.get(Calendar.MONTH),current.get(Calendar.DATE),0,0,0); 

Nó sẽ không xem xét các giá trị múi giờ và gần giống như mã của bạn. Chỉ có sự khác biệt là nó được thực hiện tất cả các reset về 0 trong một dòng.

+0

Nó đặt giờ thành 12 thay vì 0 – prashu132

1

Với date4j thư viện:

DateTime start = dt.getStartOfDay(); 
2

Giải pháp này có thể được tốt hơn vì nó không tận dụng yếu tố nặng java của Calender

public class DateTest { 
    public static void main(String[] args) { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
    long time = dateFormat.parse(dateFormat.format(new Date())).getTime(); 
    System.out.println("todays start date : " + new Date(time)); 
    } 
} 
0

Tính đến java8, nó có thể được thực hiện như sau giả bạn không quan tâm đến múi giờ

LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); 
Date midnight = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); 
Các vấn đề liên quan