Java: getMinutes และ getHours


142

คุณจะรับชั่วโมงและนาทีตั้งแต่Date.getHoursและDate.getMinutesเลิกได้อย่างไร ตัวอย่างที่ฉันพบในการค้นหาของ Google ใช้วิธีการที่เลิกใช้แล้ว


2
FYI, ลำบากชะมัดเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


171

ลองใช้Joda Timeแทนคลาส java.util.Date มาตรฐาน ห้องสมุด Joda Time มี API ที่ดีกว่ามากสำหรับการจัดการวันที่

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

ดูคำถามนี้สำหรับข้อดีข้อเสียของการใช้ห้องสมุด Joda Time

Joda เวลาก็อาจจะรวมถึงบางรุ่นในอนาคตของ Java เป็นองค์ประกอบมาตรฐานดูJSR-310


หากคุณต้องใช้คลาส java.util.Date และ java.util.Calendar ดั้งเดิมดูที่ JavaDoc's เพื่อขอความช่วยเหลือ ( java.util.Calendarและjava.util.Date )

คุณสามารถใช้คลาสดั้งเดิมเช่นนี้เพื่อดึงข้อมูลจากอินสแตนซ์วันที่ที่กำหนด

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
คำถาม: ตอนนี้ Java 8 ได้เปิดตัวด้วย LocalDateTime มีเหตุผลใดที่คุณควรใช้ Joda Time บน LocalDateTime?
chrips

ความคิดเห็น @Chrips แตกต่างกัน Joda-Time แนะนำอย่างเป็นทางการให้ใช้ java.time แทน
Ole VV

96

จาก Javadoc สำหรับ Date.getHours

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

ดังนั้นใช้

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

และเทียบเท่ากับ getMinutes


6
ดังนั้น ... มันทำงานอย่างไรถ้าฉันต้องการได้รับชั่วโมงจากวันที่ไม่ตรงกับตอนนี้?
ไมเคิล


คลาสที่น่ากลัวนี้ถูกแทนที่เมื่อหลายปีก่อนโดยคลาสjava.time ที่ทันสมัยโดยใช้ JSR 310 ใช้ZonedDateTimeแทน
Basil Bourque

58

java.time

ในขณะที่ฉันเป็นแฟนของJoda-Time , Java 8แนะนำแพคเกจjava.timeซึ่งเป็นทางออกมาตรฐานที่คุ้มค่าที่สุดของ Java! อ่านบทความนี้วันที่และเวลาของ Java SE 8สำหรับข้อมูลจำนวนมากบน java.time นอกเวลาและนาที

โดยเฉพาะอย่างยิ่งมองไปที่LocalDateTimeชั้นเรียน

ชั่วโมงและนาที:

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

4
นี่คือคำตอบที่ดีที่สุด LocalDateTime.now(ZoneId.of("Asia/Manilla"))คุณอาจต้องการที่จะให้โซนเวลาที่ชัดเจนเพื่อเตือนให้ผู้อ่านและตัวคุณเองว่านี่คือโซนเวลาการดำเนินงานที่มีความสำคัญ: อ่านnow()เพียงครั้งเดียวเพื่อความมั่นคง (เวลาจะผ่านระหว่างการโทรสองครั้ง) หากวันที่ไม่เกี่ยวข้องจริง ๆ ก็ใช้LocalTimeงานได้เช่นกัน
Ole VV

1
ขอบคุณสำหรับสิ่งนี้. ฉันพลาดเรื่องที่สร้างขึ้นในชั้นเรียนมาเป็นเวลานานแล้ว!
chrips

ความคิดเห็นโดย Ole VV ถูกต้อง แต่ถึงแม้จะดีกว่าการใช้งานระดับมากกว่าZonedDateTime LocalDateTimeเมื่อLocalDateTimeคุณทิ้งข้อมูลเขตเวลาอันมีค่าด้วยเหตุผลใดก็ตามโดยไม่ได้รับอะไรเลย
Basil Bourque

มีประโยชน์หากคุณไม่จำเป็นต้องใช้งานร่วมกับระบบย้อนหลังได้ ไม่เหมาะสมอย่างน่าเสียดายหากคุณกำลังเขียนสำหรับ Android และรองรับ API รุ่นเก่ากว่า (หรือในกรณีอื่น ๆ เมื่อ Java 8 ไม่พร้อมใช้งานเสมอ)
M_M

@M_M สำหรับ Java 6 และ 7 ส่วนใหญ่ของjava.timeการทำงานย้อนรังเพลิงในThreeTen-ย้ายกลับห้องสมุด ดัดแปลงต่อไปในช่วงต้นของ Android ในThreeTenABP สำหรับการเชื่อมโยงให้ดูที่ส่วนสุดท้ายของคำตอบของฉัน
Basil Bourque

36

ก่อนอื่นให้นำเข้า java.util.Calendar

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

12

TL; DR

ZonedDateTime.now().getHour()

… หรือ …

LocalTime.now().getHour() 

ZonedDateTime

คำตอบโดย JDเป็นสิ่งที่ดี แต่ไม่ดีที่สุด คำตอบนั้นใช้LocalDateTimeคลาส ไม่มีแนวคิดเกี่ยวกับเขตเวลาหรือออฟเซ็ตจาก UTC ซึ่งคลาสไม่สามารถแสดงช่วงเวลาได้

ZonedDateTimeดีกว่าที่จะใช้

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

ระบุเขตเวลา

หากคุณไม่ใช้ZoneIdอาร์กิวเมนต์จะมีการใช้งานโดยปริยายที่รันไทม์โดยใช้เขตเวลาเริ่มต้นปัจจุบันของ JVM

ดังนั้นนี่คือ:

ZonedDateTime.now()

... เหมือนกับสิ่งนี้:

ZonedDateTime.now( ZoneId.systemDefault() )

ดีกว่าที่จะชัดเจนผ่านเขตเวลาที่คุณต้องการ / ที่คาดไว้ ค่าเริ่มต้นสามารถเปลี่ยนแปลงได้ตลอดเวลาระหว่างรันไทม์

หากสำคัญให้ยืนยันโซนเวลากับผู้ใช้

ชั่วโมงนาที

ซักZonedDateTimeถามชั่วโมงและนาที

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

LocalTime

หากคุณต้องการเพียงแค่ช่วงเวลาของวันโดยไม่โซนเวลา, LocalTimeสารสกัดจาก

LocalTime lt = zdt.toLocalTime() ;

หรือข้ามอย่างสิ้นเชิงไปโดยตรงไปยังZonedDateTimeLocalTime

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).

ประเภทjava.time

ตารางประเภทของคลาสวันที่ - เวลาใน java.time ที่ทันสมัยเทียบกับแบบดั้งเดิม


เกี่ยวกับjava.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน

คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*คลาส

จะรับคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11และใหม่กว่า - ส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


6

ลองใช้ปฏิทิน ใช้ getInstance เพื่อรับ Calender-Object จากนั้นใช้ setTime เพื่อตั้งค่าวันที่ที่ต้องการ ตอนนี้คุณสามารถใช้รับ (ฟิลด์ int) กับค่าคงที่ที่เหมาะสมเช่น HOUR_OF_DAY หรือเพื่ออ่านค่าที่คุณต้องการ

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html


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

ฟังก์ชั่นเหล่านี้จะคืนค่า int ในชั่วโมงและนาที


1
ซ้ำ วิธีการนี้ถูกปกคลุมอยู่แล้วในคำตอบโดย JD
Basil Bourque

นั่นjava.sql.Timeคือ java.time.LocalTimeแน่นอนเหตุผลที่ทุกคนไม่ว่าจะนำระดับล้าสมัยลงเล่นเมื่อคุณได้มี คุณกำลังซับซ้อนเกินไป
Ole VV

ดูเหมือนgetMinutes()เลิกใช้แล้ว (ฉันใช้จาวา 1.8) และถูกแทนที่ด้วยCalendar.get(Calendar.MINUTE)
Saltz3

3

อีกวิธีหนึ่งในการรับนาทีและชั่วโมงคือการใช้ SimpleDateFormat

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

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

FYI, ลำบากชะมัดเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

2

ฉันอยากจะแนะนำให้ดูเวลาโฆษณา http://www.joda.org/joda-time/

ฉันกลัวที่จะเพิ่มห้องสมุดอื่นในโปรเจคหนาของฉัน แต่มันง่ายและเร็วและฉลาดและดีเลิศ นอกจากนี้มันเล่นดีกับรหัสที่มีอยู่ในระดับหนึ่ง


1

แม้ว่าฉันจะไม่แนะนำให้ทำเช่นนั้น แต่ฉันคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่าแม้ว่าวิธีการหลายอย่างใน java.util.Date นั้นไม่ได้รับการสนับสนุน แต่ก็ยังใช้งานได้ ในสถานการณ์เล็ก ๆ น้อย ๆ มันอาจโอเคที่จะใช้มัน นอกจากนี้ java.util.Calendar ค่อนข้างช้าดังนั้น getMonth และ getYear ณ วันที่อาจจะเร็วกว่านี้


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

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

มันใช้งานได้สำหรับฉัน


0

import java.util.*คุณสามารถใช้เวลาและนาทีโดยใช้ปฏิทินและคลาสตัวจัดรูปแบบ Calendar cal = Calendar.getInstance()และFormatter fmt=new Formatter()และตั้งค่ารูปแบบสำหรับชั่วโมงการแสดงผลและนาทีfmt.format("%tl:%M",cal,cal)และSystem.out.println(fmt) แสดงผลการพิมพ์เช่น10:12

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.