Tôi muốn lấy Năm, Tháng, Ngày, v.v. từ Ngày Java để so sánh với ngày Lịch Gregorian trong Java. Điều này có thể không?


231

Tôi có một đối tượng Date trong Java được lưu trữ dưới dạng loại Ngày của Java.

Tôi cũng có một lịch Gregorian tạo ngày. Ngày theo lịch của gregorian không có tham số và do đó là một ví dụ của ngày hôm nay (và thời gian?).

Với ngày java, tôi muốn có thể lấy năm, tháng, ngày, giờ, phút và giây từ loại ngày java và so sánh ngày gregoriancalWiki.

Tôi thấy rằng tại thời điểm ngày Java được lưu trữ dưới dạng dài và các phương thức duy nhất có sẵn dường như chỉ viết dài như một chuỗi ngày được định dạng. Có cách nào để truy cập Năm, tháng, ngày, v.v.?

Tôi thấy rằng getYear(), getMonth()phương pháp, vv cho Datelớp đã phản đối. Tôi đã tự hỏi cách thực hành tốt nhất để sử dụng cá thể Ngày Java mà tôi có với GregorianCalendarngày đó.

Mục tiêu cuối cùng của tôi là thực hiện một phép tính ngày để tôi có thể kiểm tra xem ngày Java có trong rất nhiều giờ, phút v.v ... của ngày và giờ hôm nay không.

Tôi vẫn là người mới sử dụng Java và đang hơi bối rối vì điều này.


1
Hey bất cứ điều gì bạn sử dụng không sử dụng Date.getYear(). Nó bị vấn đề (mà tôi không biết). Date.getYear()một lần phân tích ngày của tôi 30/06/2017 và nó trả lại năm của tôi là 117. Xem nơi nó hạ cánh, hai nghìn năm trở lại. Nhưng khi tôi in đơn giản là Đối tượng ngày, Đầu ra vẫn ổn Date.getYear();. Nhưng không .
Seenivasan

FYI: Bạn đang sử dụng các lớp Thời gian cũ rắc rối hiện đang là di sản, được thay thế bởi các lớp java.time hiện đại.
Basil Bourque

Câu trả lời:


545

Sử dụng một cái gì đó như:

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.

Coi chừng, tháng bắt đầu từ 0 chứ không phải 1.

Chỉnh sửa : Vì Java 8 nên sử dụng java.time.LocalDate tốt hơn là java.util.CalWiki . Xem câu trả lời này để biết cách làm.


4
Bạn có thể sử dụng cal.add(Calendar.DAY_OF_MONTH, -48)để làm số học ngày trên các đối tượng Lịch. Và bạn có thể so sánh hai đối tượng Lịch bằng cách sử dụng cal.compareTo(anotherCal).
Florent Guillaume

1
Rực rỡ, chúc mừng Florent! Điều trên có nghĩa là Calender sẽ trả về năm và ngày, giây, phút và giây được cập nhật khi phương thức lấy lịch được sử dụng? Dave
daveb

11
Lưu ý rằng tháng bắt đầu bằng 0 chứ không phải 1 (tức là tháng 1 = 0). docs.oracle.com/javase/6/docs/api/java/util/CalWiki.html#MONTH
Steve Kuo

10
Tại sao JAVA rất bất tiện?
Kimchi Man

3
Bởi vì Ngày và Lịch đã cũ và được thiết kế xấu. Java 8 có các đối tượng dữ liệu / thời gian tốt hơn nhiều, xem oracle.com/technetwork/articles/java/ mẹo
Florent Guillaume

88

Với Java 8 trở lên, bạn có thể chuyển đổi đối tượng Date thành đối tượng LocalDate và sau đó dễ dàng lấy năm, tháng và ngày.

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

Lưu ý rằng getMonthValue()trả về giá trị int từ 1 đến 12.


10
Bây giờ là năm 2016, tôi tin rằng việc sử dụng LocalDatetrong Java 8 là giải pháp tốt nhất giúp tiết kiệm thời gian của bạn, một giải pháp khác sử dụng CalendarDateđầy rắc rối.
AnnieFromTaiwan

2
Câu trả lời tuyệt vời - chắc chắn là tốt nhất để sử dụng java.time và tránh các lớp thời gian cũ rắc rối. Ngoài ra, hãy chú ý cách trả lời này một cách khôn ngoan giải quyết vấn đề múi giờ. Đối với bất kỳ thời điểm nào, ngày thay đổi trên toàn cầu theo múi giờ.
Basil Bourque

1
Thật không may API cấp 26+ cho Android.
Wiktor Kalinowski

14

Bạn có thể làm một cái gì đó như thế này, nó sẽ giải thích cách Datelớp hoạt động.

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");
}

Xin chào JavaCity, Cảm ơn vì điều này. Điều này rất hữu ích. Hiện tại tôi đang cố gắng tránh xa việc phân tích cú pháp từ một chuỗi ngày. Tôi sẽ cần thực hiện phân tích cú pháp này sau này khi tôi nhận được người dùng ứng dụng của mình để đặt năm, ngày và tháng. Tôi sẽ xây dựng một chuỗi để phân tích thành SimpleDateFormat. Trên đây là rất hữu ích để thấy điều này trong hành động. Ngày Java của tôi đã được tạo như một ngày và thời gian kể từ ngày khởi tạo của nó một ngày trước. Bây giờ tôi đang tìm cách so sánh với ngày gregoriancalWiki đã được khởi tạo ngày hôm nay. Xin chân thành cảm ơn
daveb

8
Vui lòng sửa mã ... chữ thường mmchỉ số phút, chữ hoa MMcó nghĩa là tháng của năm.
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());

EDIT: Đầu ra cho date= Fri Jun 15 09:20:21 CEST 2018là:

DAY FRIDAY
MONTH JUNE
YEAR 2018

Nếu bạn đã đặt ít nhất đầu ra, mọi người có thể quyết định xem điều này có hữu ích với họ hay không mà không phải chạy mã.
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
Câu trả lời trên Stack Overflow dự kiến ​​sẽ có một số thảo luận và giải thích, không chỉ là đoạn mã. Và mã của bạn chắc chắn có thể sử dụng một số lời giải thích.
Basil Bourque

1
FYI, người già lớp 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
@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 (giải pháp lịch) nhanh hơn mười lần. Bây giờ bạn có yyyy MM dd 00 00 00, và sau đó so sánh bằng date.compare


2

Nó có thể dễ dàng hơn

     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

Hãy cẩn thận gắn bắt đầu từ 0 không 1. Và Lịch cũng sử dụng pm như am để rất cẩn thận khi sử dụng Giờ một phút.

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


1
Tốt hơn là sử dụng java.time hiện đại thay thế các lớp kế thừa cũ rắc rối này được hiển thị ở đây. Xem câu trả lời đúng
Basil Bourque

Cảm ơn bạn đã trả lời và đề nghị. Nó là rất tốt
harun ugur
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.