ฉันต้องการรับปี, เดือน, วัน ฯลฯ จาก Java Date เพื่อเปรียบเทียบกับวันที่ในปฏิทิน Gregorian ใน Java เป็นไปได้ไหม


231

ฉันมีวัตถุวันที่ใน Java เก็บไว้เป็นประเภทวันที่ของ Java

ฉันยังมีวันที่สร้างปฏิทินแบบคริสต์ศักราช วันที่ของปฏิทินเกรโกเรียนไม่มีพารามิเตอร์และดังนั้นจึงเป็นตัวอย่างของวันที่วันนี้ (และเวลา?)

ด้วยวันที่ java ฉันต้องการได้รับปี, เดือน, วัน, ชั่วโมง, นาทีและวินาทีจากประเภทวันที่ java และเปรียบเทียบวันที่ gregoriancalendar

ฉันเห็นว่าในขณะนี้วันที่ Java ถูกเก็บไว้เป็นเวลานานและวิธีการเดียวที่มีอยู่ดูเหมือนว่าจะเขียนยาวเป็นสตริงวันที่จัดรูปแบบ มีวิธีเข้าถึงปีเดือนวัน ฯลฯ หรือไม่?

ผมเห็นว่าgetYear(), getMonth()วิธีการ ฯลฯ สำหรับDateระดับได้รับการคัดค้าน ฉันสงสัยว่าวิธีปฏิบัติที่ดีที่สุดในการใช้อินสแตนซ์ Java Date ที่ฉันมีกับGregorianCalendarวันที่คืออะไร

เป้าหมายสุดท้ายของฉันคือการคำนวณวันที่เพื่อให้ฉันสามารถตรวจสอบว่าวันที่ของ Java อยู่ภายในเวลาไม่กี่ชั่วโมงนาที ฯลฯ ของวันที่และเวลาของวันนี้

ฉันยังเป็นมือใหม่กับ Java และฉันก็รู้สึกงุนงงกับเรื่องนี้


1
เฮ้สิ่งที่คุณใช้ไม่ได้ใช้Date.getYear()มันมีปัญหา (ที่ฉันไม่รู้) Date.getYear()เมื่อแยกวิเคราะห์วันที่ของฉัน 30/06/2017 และมันกลับปีของฉันเป็น 117 ดูที่มันลงสองพันปีปี แต่เมื่อฉันพิมพ์เพียงวัตถุวัน, เอาท์พุทเป็น Fine.But Date.getYear();ไม่
Seenivasan

FYI: คุณกำลังใช้คลาสวันที่และเวลาเก่าซึ่งเป็นปัญหาซึ่งถูกแทนที่ด้วยคลาส java.time ที่ทันสมัย
Basil Bourque

คำตอบ:


545

ใช้สิ่งที่ชอบ:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

ระวังเดือนเริ่มต้นที่ 0 ไม่ใช่ 1

แก้ไข : ตั้งแต่ Java 8 มันจะดีกว่าที่จะใช้java.time.LocalDateมากกว่าjava.util.Calendar ดูคำตอบนี้สำหรับวิธีการ


4
คุณสามารถใช้cal.add(Calendar.DAY_OF_MONTH, -48)การคำนวณทางคณิตศาสตร์แบบวันบนวัตถุในปฏิทิน cal.compareTo(anotherCal)และคุณสามารถเปรียบเทียบวัตถุสองปฏิทินโดยใช้
Guillaume Florent Florent

1
ยอดเยี่ยมไชโย Florent! ข้างต้นหมายความว่าปฏิทินจะกลับปีและวัน, วินาที, นาทีและวินาทีเมื่อมีการใช้วิธีการรับปฏิทิน? เดฟ
daveb

11
โปรดทราบว่าเดือนนั้นเริ่มต้นด้วย 0 และไม่ใช่ 1 (เช่น January = 0) docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
ทำไม JAVA ถึงไม่สะดวก
กิมจิชาย

3
เพราะวันที่และปฏิทินเก่าและออกแบบมาไม่ดี Java 8 มีวัตถุข้อมูล / เวลาที่ดีกว่ามากดูoracle.com/technetwork/articles/java/…
Florent Guillaume

88

ด้วย Java 8 และใหม่กว่าคุณสามารถแปลงวัตถุวันที่เป็นวัตถุLocalDateจากนั้นรับปีเดือนและวันได้อย่างง่ายดาย

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

โปรดทราบว่าgetMonthValue()ส่งกลับค่า int จาก 1 ถึง 12


10
ตอนนี้คือปี 2559 ผมเชื่อว่าการใช้งานLocalDateใน Java 8 เป็นทางออกที่ดีที่สุดที่ช่วยประหยัดเวลาของคุณโซลูชั่นอื่นที่ใช้CalendarและDateเต็มไปด้วยปัญหา
AnnieFromTaiwan

2
คำตอบที่ดี - ควรใช้java.timeและหลีกเลี่ยงคลาสวันที่และเวลาที่ลำบาก นอกจากนี้ให้สังเกตว่าคำตอบนี้ตอบปัญหาของเขตเวลาอย่างชาญฉลาดอย่างไร สำหรับช่วงเวลาใด ๆ วันที่จะแตกต่างกันไปทั่วโลกตามโซนเวลา
Basil Bourque

1
น่าเสียดายที่ API ระดับ 26+ สำหรับ Android
Wiktor Kalinowski

14

คุณสามารถทำอะไรเช่นนี้มันจะอธิบายวิธีการDateทำงานของชั้นเรียน

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

สวัสดี JavaCity ขอบคุณสำหรับสิ่งนี้ มันมีประโยชน์มาก ในขณะนี้ฉันพยายามหลีกเลี่ยงการแยกวิเคราะห์จากสตริงวันที่ ฉันจะต้องทำการแยกวิเคราะห์นี้ในภายหลังอย่างไรก็ตามเมื่อฉันได้รับผู้ใช้แอปพลิเคชันของฉันเพื่อตั้งปีวันและเดือน ฉันจะสร้างสตริงเพื่อวิเคราะห์คำใน SimpleDateFormat ด้านบนมีประโยชน์อย่างมากเมื่อเห็นการทำงานนี้ วันที่ Java ของฉันถูกสร้างเป็นวันที่และเวลาจากการเริ่มต้นวันที่ผ่านมา ตอนนี้ฉันกำลังมองหาเพื่อเปรียบเทียบกับวันที่ gregoriancalendar ซึ่งได้รับการยกตัวอย่างวันนี้ ขอขอบคุณอย่างจริงใจ
daveb

8
โปรดแก้ไขรหัส ... ตัวพิมพ์เล็กmmหมายถึงนาทีตัวพิมพ์ใหญ่MMหมายถึงเดือนของปี
YoYo

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

แก้ไข: ผลลัพธ์สำหรับdate= Fri Jun 15 09:20:21 CEST 2018คือ:

DAY FRIDAY
MONTH JUNE
YEAR 2018

ถ้าคุณใส่เอาท์พุทอย่างน้อยคนก็สามารถตัดสินใจได้ว่าสิ่งนี้อาจเป็นประโยชน์กับพวกเขาหรือไม่โดยไม่ต้องเรียกใช้รหัส
SantiBailors

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
คำตอบเกี่ยวกับ Stack Overflow คาดว่าจะมีการสนทนาและคำอธิบายไม่ใช่เพียงข้อมูลโค้ด และรหัสของคุณสามารถใช้คำอธิบายบางอย่างแน่นอน
Basil Bourque

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

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (โซลูชันปฏิทิน) เร็วขึ้นสิบเท่า ขณะนี้คุณมี yyyy MM dd 00 00 00 แล้วเปรียบเทียบโดยใช้ date.compare


2

มันอาจจะง่ายกว่า

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

ระมัดระวังการเมานต์เริ่มต้นจาก 0 ไม่ใช่ 1 และยังใช้ปฏิทิน pm เช่นฉันเพื่อให้ระมัดระวังมากเมื่อใช้ชั่วโมงและนาที

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
ดีกว่าที่จะใช้ java.time ที่ทันสมัยซึ่งแทนที่คลาสเก่าที่มีปัญหาเหล่านี้ที่แสดงที่นี่ ดูคำตอบที่ถูกต้อง
Basil Bourque

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