Java: getMinutes và getHours


142

Làm thế nào để bạn có được giờ và phút từ Date.getHoursDate.getMinutesđã bị phản đối? Các ví dụ mà tôi tìm thấy trên tìm kiếm của Google đã sử dụng các phương pháp không dùng nữa.


2
FYI, các lớp học ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


171

Hãy thử sử dụng Joda Time thay vì các lớp java.util.Date tiêu chuẩn. Thư viện Joda Time có API tốt hơn nhiều để xử lý ngày.

DateTime dt = new DateTime();  // current time
int month = dt.getMonth();     // gets the current month
int hours = dt.getHourOfDay(); // gets hour of day

Xem câu hỏi này để biết những ưu và nhược điểm của việc sử dụng thư viện Joda Time.

Joda Time cũng có thể được đưa vào một số phiên bản tương lai của Java như là một thành phần tiêu chuẩn, xem JSR-310 .


Nếu bạn phải sử dụng các lớp java.util.Date và java.util.CalWiki truyền thống, hãy xem JavaDoc của họ để được trợ giúp ( java.util.CalWikijava.util.Date ).

Bạn có thể sử dụng các lớp truyền thống như thế này để tìm nạp các trường từ thể hiện Ngày đã cho.

Date date = new Date();   // given date
Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
calendar.setTime(date);   // assigns calendar to given date 
calendar.get(Calendar.HOUR_OF_DAY); // gets hour in 24h format
calendar.get(Calendar.HOUR);        // gets hour in 12h format
calendar.get(Calendar.MONTH);       // gets month number, NOTE this is zero based!

2
Câu hỏi: Bây giờ Java 8 đã triển khai với LocalDateTime, có lý do nào bạn nên sử dụng Joda Time trên LocalDateTime không?
chrips

@Chrips Ý kiến ​​khác nhau. Joda-Time chính thức khuyên bạn nên sử dụng java.time thay thế.
Ole VV

96

Từ Javadoc cho Date.getHours

As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY)

Vì vậy, sử dụng

Calendar rightNow = Calendar.getInstance();
int hour = rightNow.get(Calendar.HOUR_OF_DAY);

và tương đương với getMinutes.


6
Vậy ... làm thế nào để nó hoạt động nếu tôi muốn có được số giờ kể từ Ngày không tương ứng với bây giờ?
Michael


Lớp khủng khiếp này đã được thay thế từ nhiều năm trước bởi các lớp java.time hiện đại , với việc áp dụng JSR 310. ZonedDateTimeThay vào đó hãy sử dụng .
Basil Bourque

58

java.time

Trong khi tôi là một fan hâm mộ của Joda-Time , Java 8 giới thiệu gói java.time cuối cùng là một giải pháp tiêu chuẩn Java đáng giá! Đọc bài viết này, Ngày và Giờ của Java SE 8 , để có lượng thông tin tốt về java.time ngoài giờ và phút.

Đặc biệt, nhìn vào LocalDateTimelớp học.

Giờ và phút:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();

4
Đây là câu trả lời tốt nhất. Bạn có thể muốn cung cấp múi giờ rõ ràng để nhắc nhở người đọc và chính bạn rằng đây là thao tác nhạy cảm với múi giờ : LocalDateTime.now(ZoneId.of("Asia/Manilla")). now()Chỉ đọc một lần để thống nhất (thời gian sẽ trôi qua giữa hai cuộc gọi). Nếu ngày thực sự không liên quan, LocalTimelàm việc quá.
Ole VV

1
Cảm ơn vì điều này. Tôi đã bằng cách nào đó NHIỆM VỤ này được xây dựng trong lớp trong một thời gian dài!
chrips

Nhận xét của Ole VV là đúng. Nhưng thậm chí tốt hơn, sử dụng ZonedDateTimelớp hơn là LocalDateTime. Với LocalDateTimebạn đang loại bỏ thông tin múi giờ có giá trị mà không có lý do, không có gì đạt được.
Basil Bourque

Hữu ích nếu bạn không phải tương thích ngược. Đáng tiếc là không phù hợp nếu bạn đang viết cho Android và hỗ trợ các phiên bản API cũ hơn (hoặc trong bất kỳ trường hợp nào khác khi Java 8 không có sẵn).
M_M

@M_M Đối với Java 6 & 7, hầu hết các chức năng java.time được chuyển ngược lại trong thư viện ThreeTen-Backport . Thích nghi hơn nữa với Android sớm trong ThreeTenABP . Đối với các liên kết, xem phần cuối của câu trả lời của tôi .
Basil Bourque

36

Đầu tiên, nhập java.util.CalWiki

Calendar now = Calendar.getInstance();
System.out.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE));

12

tl; dr

ZonedDateTime.now().getHour()

… hoặc là …

LocalTime.now().getHour() 

ZonedDateTime

Câu trả lời của JD là tốt nhưng không tối ưu. Câu trả lời đó sử dụng LocalDateTimelớp. Không có bất kỳ khái niệm nào về múi giờ hoặc bù từ UTC, lớp đó không thể biểu thị một khoảnh khắc.

Tốt hơn để sử dụng ZonedDateTime.

ZoneId z = ZoneID.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Chỉ định múi giờ

Nếu bạn bỏ qua ZoneIdđối số, một đối số sẽ được áp dụng hoàn toàn trong thời gian chạy bằng cách sử dụng múi giờ mặc định hiện tại của JVM.

Vậy đây:

ZonedDateTime.now()

Sôi cũng giống như thế này:

ZonedDateTime.now( ZoneId.systemDefault() )

Tốt hơn là rõ ràng, vượt qua múi giờ mong muốn / mong đợi của bạn. Mặc định có thể thay đổi bất cứ lúc nào trong thời gian chạy.

Nếu quan trọng, xác nhận múi giờ với người dùng.

Giờ phút

Thẩm vấn trong ZonedDateTimegiờ và phút.

int hour = zdt.getHour() ;
int minute = zdt.getMinute() ;

LocalTime

Nếu bạn muốn chỉ là thời gian trong ngày mà không có múi giờ, hãy giải nén LocalTime.

LocalTime lt = zdt.toLocalTime() ;

Hoặc bỏ qua ZonedDateTimehoàn toàn, đi trực tiếp đến LocalTime.

LocalTime lt = LocalTime.now( z ) ;  // Capture the current time-of-day as seen in the wall-clock time used by the people of a particular region (a time zone).

các loại java.time

Bảng các loại lớp thời gian trong java.time hiện đại so với di sản.


Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp.

Nơi để có được các lớp java.time?

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .



3
int hr=Time.valueOf(LocalTime.now()).getHours();
int minutes=Time.valueOf(LocalTime.now()).getMinutes();

Các hàm này sẽ trả về giá trị int trong giờ và phút.


1
Bản sao. Cách tiếp cận này đã được đề cập trong Trả lời của JD .
Basil Bourque

Có phải vậy java.sql.Timekhông? Chắc chắn không có lý do nào để đưa lớp lỗi thời đó vào chơi khi bạn có java.time.LocalTime. Bạn đang quá phức tạp.
Ole VV

Có vẻ như getMinutes()đã bị phản đối (Tôi đang sử dụng java 1.8) và đã được thay thế bằngCalendar.get(Calendar.MINUTE)
Saltz3

3

Một cách nữa để có được vài phút và giờ là sử dụng SimpleDateFormat.

SimpleDateFormat formatMinutes = new SimpleDateFormat("mm")
String getMinutes = formatMinutes.format(new Date())

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())

FYI, các lớp học ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

2

Tôi muốn giới thiệu thời gian tìm kiếm quảng cáo joda. http://www.joda.org/joda-time/

Tôi sợ thêm một thư viện khác vào dự án dày của mình, nhưng nó thật dễ dàng, nhanh chóng và thông minh và tuyệt vời. Thêm vào đó, nó chơi tốt với mã hiện có, ở một mức độ nào đó.


1

Mặc dù tôi không khuyên bạn nên làm như vậy, tôi nghĩ rằng đáng để chỉ ra rằng mặc dù nhiều phương thức trên java.util.Date đã không được chấp nhận, nhưng chúng vẫn hoạt động. Trong các tình huống tầm thường, có thể sử dụng chúng. Ngoài ra, java.util.CalWiki khá chậm, vì vậy getMonth và getYear on Date có thể nhanh hơn một cách hữu ích.


1
public static LocalTime time() {
    LocalTime ldt = java.time.LocalTime.now();

    ldt = ldt.truncatedTo(ChronoUnit.MINUTES);
    System.out.println(ldt);
    return ldt;
}

Điều này làm việc cho tôi


0

import java.util.*Bạn có thể nhận được và phút bằng cách sử dụng lớp lịch và định dạng. Calendar cal = Calendar.getInstance()Formatter fmt=new Formatter()đặt định dạng để hiển thị giờ và phút fmt.format("%tl:%M",cal,cal)System.out.println(fmt) đầu ra in hiển thị như10:12

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.