2013-07-23 32 views
76

Tôi gặp sự cố khi đặt lại giờ trong Java. Trong một ngày cụ thể, tôi muốn đặt giờ thành 00:00:00.Đặt giờ thành 00:00:00

Đây là mã của tôi:

/** 
    * Resets milliseconds, seconds, minutes and hours from the provided date 
    * 
    * @param date 
    * @return 
    */ 
    public static Date trim(Date date) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.HOUR, 0); 

     return calendar.getTime(); 
    } 

Vấn đề là đôi khi thời gian là 12:00:00 và đôi khi nó là 00:00:00 và khi tôi truy vấn cơ sở dữ liệu cho một thực thể đã được lưu trên 07.02.2013 00:00:00 và thời gian tổ chức thực tế, được lưu trữ, là 12:00:00 truy vấn không thành công.

Tôi biết rằng 12:00:00 == 00:00:00!

Tôi đang sử dụng AppEngine. Đây có phải là lỗi appengine, sự cố hoặc một số sự cố khác không? Hay nó phụ thuộc vào cái gì khác?

+0

Điều này có thể liên quan đến các ngôn ngữ khác nhau hoặc điều này xảy ra với cùng một máy tính không? – LostBoy

+0

nó xảy ra khi tôi triển khai trên appengine. – Adelin

+0

Rất nhiều giải pháp khác để cắt giảm thời gian: http://stackoverflow.com/a/1908955/2646526 – heenenee

Trả lời

130

Sử dụng một hằng số khác thay vì Calendar.HOUR, sử dụng Calendar.HOUR_OF_DAY.

calendar.set(Calendar.HOUR_OF_DAY, 0); 

Calendar.HOUR sử dụng 0-11 (để sử dụng với AM/PM), và Calendar.HOUR_OF_DAY sử dụng 0-23.

Để báo Javadocs:

public static int thức GIỜ

số Field để có được và bộ chỉ giờ của buổi sáng hoặc buổi chiều. HOUR được sử dụng cho đồng hồ 12 giờ (0 - 11). Trưa và nửa đêm được đại diện bởi 0, không phải bằng 12. Ví dụ, lúc 10: 04: 15,250 PM giờ là 10.

public static int thức HOUR_OF_DAY

Dòng số để nhận và đặt cho biết giờ trong ngày. HOUR_OF_DAY được sử dụng cho đồng hồ 24 giờ 24 giờ. Ví dụ, lúc 10: 04: 15,250 PM các HOUR_OF_DAY là 22.

Testing (. "Bây giờ" hiện c 14:55 là vào ngày 23 tháng 7 năm 2013 Thái Bình Dương Ánh sáng ban ngày Thời gian):

public class Main 
{ 
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    public static void main(String[] args) 
    { 
     Calendar now = Calendar.getInstance(); 
     now.set(Calendar.HOUR, 0); 
     now.set(Calendar.MINUTE, 0); 
     now.set(Calendar.SECOND, 0); 
     System.out.println(sdf.format(now.getTime())); 
     now.set(Calendar.HOUR_OF_DAY, 0); 
     System.out.println(sdf.format(now.getTime())); 
    } 
} 

Output :

$ javac Main.java 
$ java Main 
2013-07-23 12:00:00 
2013-07-23 00:00:00 
+3

@JarrodRoberson Nhưng sử dụng 'Calendar.HOUR' sẽ không đặt PM thành AM, hãy để nó là 12:00 trưa. – rgettman

+0

Bạn có thể giúp tôi trong việc xây dựng một LocalDate với giờ, phút và giây? Tôi biết một tùy chọn là theo dõi DateTime. – Woody

+6

Bất kỳ ai đã tạo trường HOUR và HOUR_OF_DAY đáng lẽ phải bị đánh vần và đặt vào khẩu phần ăn. – AndroidDev

9

Dưới đây là một số chức năng tiện ích mà tôi sử dụng để thực hiện việc này.

/** 
* sets all the time related fields to ZERO! 
* 
* @param date 
* 
* @return Date with hours, minutes, seconds and ms set to ZERO! 
*/ 
public static Date zeroTime(final Date date) 
{ 
    return DateTimeUtil.setTime(date, 0, 0, 0, 0); 
} 

/** 
* Set the time of the given Date 
* 
* @param date 
* @param hourOfDay 
* @param minute 
* @param second 
* @param ms 
* 
* @return new instance of java.util.Date with the time set 
*/ 
public static Date setTime(final Date date, final int hourOfDay, final int minute, final int second, final int ms) 
{ 
    final GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTime(date); 
    gc.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    gc.set(Calendar.MINUTE, minute); 
    gc.set(Calendar.SECOND, second); 
    gc.set(Calendar.MILLISECOND, ms); 
    return gc.getTime(); 
} 
0

Một cách khác để làm điều này sẽ được sử dụng một DateFormat mà không cần bất kỳ giây:

public static Date trim(Date date) { 
    DateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 
    Date trimmed = null; 
    try { 
     trimmed = format.parse(format.format(date)); 
    } catch (ParseException e) {} // will never happen 
    return trimmed; 
} 
12

java.time

Sử dụng java.time khuôn khổ xây dựng vào Java 8 và sau đó. Xem Tutorial.

import java.time.LocalTime; 
import java.time.LocalDateTime; 

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224 
# start of a day 
now.with(LocalTime.MIN); # 2015-11-19T00:00 
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00 

Nếu bạn không cần thời gian trong ngày (giờ, phút, giây, vv ..) hãy cân nhắc sử dụng lớp LocalDate.

LocalDate.now(); # 2015-11-19 
+0

Đây phải là câu trả lời được chấp nhận mới vì Java 1.8 đã được phát hành vì câu hỏi này được hỏi lần đầu tiên. –

1

Việc làm này có thể được dễ dàng hơn (Trong Java 8)

LocalTime.ofNanoOfDay(0) 
+0

Cảm ơn bạn, tôi đã làm việc với những thứ khác trong 2 năm qua và Java 6/7 trước đó. Tôi đã quay trở lại Java ngay bây giờ (sau khi đã làm việc với vài thứ về Groovy) và thích sự khác biệt của Java 8. – meszias

2

hơn Một JAVA 8 cách:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS); 

Nhưng nó hữu ích hơn nhiều để chỉnh sửa ngày đó đã tồn tại .

3

Bạn sẽ tốt hơn để múi giờ chủ yếu là thiết lập để các thành phần DateFormat như thế này:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

Sau đó, bạn có thể nhận được "00:00:00" thời gian bằng cách đi qua 0 mili giây để định dạng:

String time = dateFormat.format(0); 

hoặc bạn có thể tạo đối tượng Date:

Date date = new Date(0); // also pass milliseconds 
String time = dateFormat.foramt(date); 

hoặc bạn có thể có nhiều khả năng sử dụng Thành phần lịch nhưng bạn cũng nên đặt múi giờ là GMT thành lịch thể hiện:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); 
calendar.set(Calendar.HOUR_OF_DAY, 5); 
calendar.set(Calendar.MINUTE, 37); 
calendar.set(Calendar.SECOND, 27); 

dateFormat.format(calendar.getTime()); 
Các vấn đề liên quan