Làm thế nào để xác định ngày trong tuần bằng cách vượt qua ngày cụ thể?


187

Ví dụ: tôi có ngày: "23/2/2010" (ngày 23 tháng 2 năm 2010). Tôi muốn chuyển nó đến một chức năng sẽ trả về ngày trong tuần . Tôi có thể làm cái này như thế nào?

Trong ví dụ này, hàm sẽ trả về String"Tue".

Ngoài ra, nếu chỉ cần ngày thứ tự là mong muốn, làm thế nào có thể được lấy ra?

Câu trả lời:


349

Đúng. Tùy thuộc vào trường hợp chính xác của bạn:

  • Bạn có thể sử dụng java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    
  • nếu bạn cần đầu ra Tuethay vì 3 (Số ngày trong tuần được lập chỉ mục bắt đầu từ 1 cho Chủ nhật, hãy xem Lịch.SUNDAY), thay vì xem qua lịch, chỉ cần định dạng lại chuỗi: new SimpleDateFormat("EE").format(date)( EEcó nghĩa là "ngày trong tuần, phiên bản ngắn" )

  • nếu bạn có đầu vào dưới dạng chuỗi, thay vì Date, bạn nên sử dụng SimpleDateFormatđể phân tích cú pháp:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • bạn có thể sử dụng joda-time DateTimevà gọi dateTime.dayOfWeek()và / hoặc DateTimeFormat.

  • chỉnh sửa: kể từ Java 8, bây giờ bạn có thể sử dụng gói java.time thay vì joda-time


20
Các ngày trong tuần bắt đầu từ 1 là Chủ nhật, vì vậy tôi nghĩ Tue sẽ là 3.
Mohammad Banisaeid

13
Trong những điều khác cần cẩn thận, nếu bạn đặt ngày trong đối tượng Lịch bằng cách sử dụng số nguyên (không thông qua phân tích chuỗi), thì hãy lưu ý rằng số tháng là không dựa trên, vì vậy tháng 1 là 0 và tháng 12 là 11.
RenniePet

4
@RenniePet: Tốt. Ngoài ra, bạn có thể sử dụng hằng số trong Calendarlớp, chẳng hạn như Calendar.SUNDAYhoặc Calendar.JANUARY.
Mohammad Banisaeid

2
Câu trả lời này là một câu trả lời tuyệt vời khi nó được viết. Hôm nay bạn sẽ muốn các lớp học hiện nay là lỗi thời Calendar, DateDateTimeFormat(và Joda thời gian quá) và sử dụng Java 8 java.timelớp, ví dụ YearMonthhay LocalDate. Xem thêm trong câu trả lời này .
Ole VV

4
FYI, các lớp thời gian cũ rắc rối như java.util.Date, java.util.Calendarjava.text.SimpleDateFormathiện là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .
Basil Bourque

67
  String input_date="01/08/2012";
  SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy");
  Date dt1=format1.parse(input_date);
  DateFormat format2=new SimpleDateFormat("EEEE"); 
  String finalDay=format2.format(dt1);

Sử dụng mã này để tìm tên Ngày từ một ngày đầu vào. Đơn giản và được kiểm tra tốt.


1
Nếu bạn sử dụng phương pháp này, hãy lưu ý cẩn thận về thứ tự ngày và tháng.
Joel Christophel

1
Tôi nghĩ rằng bạn cần phải đặt nó trong một khối thử bắt
Shafaet

1
FYI, các lớp thời gian cũ rắc rối như java.util.Date, java.util.Calendarjava.text.SimpleDateFormathiện là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .
Basil Bourque

Android chỉ triển khai LocalDate sau API 26.
Jacob Sánchez

29

Đơn giản chỉ cần sử dụng SimpleDateFormat .

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", java.util.Locale.ENGLISH);
Date myDate = sdf.parse("28/12/2013");
sdf.applyPattern("EEE, d MMM yyyy");
String sMyDate = sdf.format(myDate);

Kết quả là: Thứ bảy, ngày 28 tháng 12 năm 2013

Các constructor mặc định đang "mặc định" Locale , vì vậy hãy cẩn thận sử dụng nó khi bạn cần một mô hình cụ thể.

public SimpleDateFormat(String pattern) {
    this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}

21

tl; dr

Sử dụng java.time ...

LocalDate.parse(                               // Generate `LocalDate` object from String input.
             "23/2/2010" ,
             DateTimeFormatter.ofPattern( "d/M/uuuu" ) 
         )                                    
         .getDayOfWeek()                       // Get `DayOfWeek` enum object.
         .getDisplayName(                      // Localize. Generate a String to represent this day-of-week.
             TextStyle.SHORT_STANDALONE ,      // How long or abbreviated. Some languages have an alternate spelling for "standalone" use (not so in English).
             Locale.US                         // Or Locale.CANADA_FRENCH and such. Specify a `Locale` to determine (1) human language for translation, and (2) cultural norms for abbreviation, punctuation, etc.
         ) 

Thứ ba

Xem này chạy trực tiếp tại IdeOne.com (nhưng chỉ Locale.UShoạt động ở đó).

java.time

Xem mã ví dụ của tôi ở trên và xem Câu trả lời đúng cho java.time của Przemek .

Số thường

Nếu chỉ cần ngày thứ tự là mong muốn, làm thế nào có thể được lấy ra?

Đối với số thứ tự, hãy xem xét chuyển xung quanh DayOfWeekđối tượng enum thay vì DayOfWeek.TUESDAY. Hãy nhớ rằng a DayOfWeeklà một đối tượng thông minh, không chỉ là một chuỗi hoặc số nguyên. Việc sử dụng các đối tượng enum đó làm cho mã của bạn có nhiều tài liệu hơn, đảm bảo các giá trị hợp lệ và cung cấp loại an toàn .

Nhưng nếu bạn nhấn mạnh, yêu cầu DayOfWeekmột số . Bạn nhận được 1-7 cho Thứ Hai-Chủ Nhật theo tiêu chuẩn ISO 8601 .

int ordinal = myLocalDate.getDayOfWeek().getValue() ;

Joda-Thời gian

CẬP NHẬT: Dự án Joda-Time hiện đang ở chế độ bảo trì. Nhóm tư vấn di chuyển đến các lớp java.time. Khung công tác java.time được tích hợp vào Java 8 (cũng như được chuyển ngược lại sang Java 6 & 7tiếp tục thích nghi với Android ).

Dưới đây là mã ví dụ sử dụng thư viện Joda-Time phiên bản 2.4, như được đề cập trong câu trả lời được chấp nhận bởi Bozho . Joda-Time vượt trội hơn nhiều so với các lớp java.util.Date/.CalWiki được gói cùng với Java.

LocalDate

Joda-Time cung cấp LocalDatelớp để đại diện cho một ngày mà không có bất kỳ thời gian trong ngày hoặc múi giờ. Chỉ những gì câu hỏi này yêu cầu. Các lớp java.util.Date/.CalWiki cũ đi kèm với Java thiếu khái niệm này.

Phân tích

Phân tích chuỗi thành một giá trị ngày.

String input = "23/2/2010";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( input );

Trích xuất

Trích xuất từ ​​giá trị ngày ngày số tuần và tên.

int dayOfWeek = localDate.getDayOfWeek(); // Follows ISO 8601 standard, where Monday = 1, Sunday = 7.
Locale locale = Locale.US;  // Locale specifies the human language to use in determining day-of-week name (Tuesday in English versus Mardi in French).
DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "E" ).withLocale( locale );
String output = formatterOutput.print( localDate ); // 'E' is code for abbreviation of day-of-week name. See Joda-Time doc.
String outputQuébécois = formatterOutput.withLocale( Locale.CANADA_FRENCH ).print( localDate );

Đổ

Đổ vào bàn điều khiển.

System.out.println( "input: " + input );
System.out.println( "localDate: " + localDate ); // Defaults to ISO 8601 formatted strings.
System.out.println( "dayOfWeek: " + dayOfWeek );
System.out.println( "output: " + output );
System.out.println( "outputQuébécois: " + outputQuébécois );

Chạy

Khi chạy.

input: 23/2/2010
localDate: 2010-02-23
dayOfWeek: 2
output: Tue
outputQuébécois: mar.

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.

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.

Để 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 .

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 .


15

java.time

Sử dụng java.timekhung được xây dựng trong Java 8 trở lên.

Các enum có thể tạo ra một String tên của ngày tự động cục bộ với ngôn ngữ của con người và chuẩn mực văn hóa của một . Chỉ định một để cho biết bạn muốn tên dài hoặc tên viết tắt.DayOfWeek LocaleTextStyle

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.time.format.TextStyle
import java.util.Locale
import java.time.DayOfWeek;

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
LocalDate date = LocalDate.parse("23/2/2010", formatter); // LocalDate = 2010-02-23
DayOfWeek dow = date.getDayOfWeek();  // Extracts a `DayOfWeek` enum object.
String output = dow.getDisplayName(TextStyle.SHORT, Locale.US); // String = Tue

1
Điều này chỉ có thể được sử dụng trong Oreo và trên apis.
codepeaker

2
@codepeaker Hầu hết các chức năng của java.time được chuyển ngược lại sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Thích nghi hơn nữa cho Android trước đó (<26) trong ThreeTenABP . Xem Cách sử dụng ThreeTenABP .
Basil Bourque

9

Bạn có thể thử đoạn mã sau:

import java.time.*;

public class Test{
   public static void main(String[] args) {
      DayOfWeek dow = LocalDate.of(2010,Month.FEBRUARY,23).getDayOfWeek();
      String s = String.valueOf(dow);
      System.out.println(String.format("%.3s",s));
   }
}

Làm thế nào để câu trả lời này thêm giá trị vượt quá hai hoặc ba câu trả lời trước bằng cách sử dụng LocalDate? Bạn đã đọc chúng trước khi đăng?
Basil Bourque

1
Đây là một câu trả lời tốt, và nó khác với tất cả những câu hỏi trước. Nó sử dụng API LocalDate.of () để tạo ngày và nó ngắn hơn nhiều so với hầu hết các câu trả lời khác (đôi khi câu trả lời ngắn tốt hơn dài) ...
Alexey

9
public class TryDateFormats {
    public static void main(String[] args) throws ParseException {
        String month = "08";
        String day = "05";
        String year = "2015";
        String inputDateStr = String.format("%s/%s/%s", day, month, year);
        Date inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inputDate);
        String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();
        System.out.println(dayOfWeek);
    }
}

Giải pháp tốt, tôi đã tìm chính xác loại giải pháp này, Dòng yêu cầu của tôi đã giải quyết vấn đề của tôi. Chuỗi dayOfWeek = calendar.getDisplayName (Lịch.DAY_OF_WEEK, Lịch.LONG, Locale.US) .toUpperCase ();
Muhammad Azam

8

Đối với Java 8 trở lên , Localdate thích hợp hơn

import java.time.LocalDate;

public static String findDay(int month, int day, int year) {

    LocalDate localDate = LocalDate.of(year, month, day);

    java.time.DayOfWeek dayOfWeek = localDate.getDayOfWeek();
    System.out.println(dayOfWeek);

    return dayOfWeek.toString();
}

Lưu ý: nếu đầu vào là Chuỗi / Người dùng xác định, thì bạn nên phân tích cú pháp thành int .


6
...
import java.time.LocalDate;
...
//String month = in.next();
int mm = in.nextInt();
//String day = in.next();
int dd = in.nextInt();
//String year = in.next();
int yy = in.nextInt();
in.close();
LocalDate dt = LocalDate.of(yy, mm, dd);
System.out.print(dt.getDayOfWeek());

5

Một cách "vui vẻ" khác là sử dụng thuật toán Doomsday . Đó là một phương pháp dài hơn nhưng cũng nhanh hơn nếu bạn không cần tạo đối tượng Lịch với một ngày nhất định.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * @author alain.janinmanificat
 */
public class Doomsday {

    public static HashMap<Integer, ArrayList<Integer>> anchorDaysMap = new HashMap<>();
    public static HashMap<Integer, Integer> doomsdayDate = new HashMap<>();
    public static String weekdays[] = new DateFormatSymbols(Locale.FRENCH).getWeekdays();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws ParseException, ParseException {

        // Map is fed manually but we can use this to calculate it : http://en.wikipedia.org/wiki/Doomsday_rule#Finding_a_century.27s_anchor_day
        anchorDaysMap.put(Integer.valueOf(0), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1700));
                add(Integer.valueOf(2100));
                add(Integer.valueOf(2500));
            }
        });

        anchorDaysMap.put(Integer.valueOf(2), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1600));
                add(Integer.valueOf(2000));
                add(Integer.valueOf(2400));
            }
        });

        anchorDaysMap.put(Integer.valueOf(3), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1500));
                add(Integer.valueOf(1900));
                add(Integer.valueOf(2300));
            }
        });

        anchorDaysMap.put(Integer.valueOf(5), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1800));
                add(Integer.valueOf(2200));
                add(Integer.valueOf(2600));
            }
        });

        //Some reference date that always land on Doomsday
        doomsdayDate.put(Integer.valueOf(1), Integer.valueOf(3));
        doomsdayDate.put(Integer.valueOf(2), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(3), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(4), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(5), Integer.valueOf(9));
        doomsdayDate.put(Integer.valueOf(6), Integer.valueOf(6));
        doomsdayDate.put(Integer.valueOf(7), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(8), Integer.valueOf(8));
        doomsdayDate.put(Integer.valueOf(9), Integer.valueOf(5));
        doomsdayDate.put(Integer.valueOf(10), Integer.valueOf(10));
        doomsdayDate.put(Integer.valueOf(11), Integer.valueOf(7));
        doomsdayDate.put(Integer.valueOf(12), Integer.valueOf(12));

        long time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {

            //Get a random date
            int year = 1583 + new Random().nextInt(500);
            int month = 1 + new Random().nextInt(12);
            int day = 1 + new Random().nextInt(7);

            //Get anchor day and DoomsDay for current date
            int twoDigitsYear = (year % 100);
            int century = year - twoDigitsYear;
            int adForCentury = getADCentury(century);
            int dd = ((int) twoDigitsYear / 12) + twoDigitsYear % 12 + (int) ((twoDigitsYear % 12) / 4);

            //Get the gap between current date and a reference DoomsDay date
            int referenceDay = doomsdayDate.get(month);
            int gap = (day - referenceDay) % 7;

            int result = (gap + adForCentury + dd) % 7;

            if(result<0){
                result*=-1;
            }
            String dayDate= weekdays[(result + 1) % 8];
            //System.out.println("day:" + dayDate);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 80

         time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            Calendar c = Calendar.getInstance();
            //I should have used random date here too, but it's already slower this way
            c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("12/04/1861"));
//            System.out.println(new SimpleDateFormat("EE").format(c.getTime()));
            int result2 = c.get(Calendar.DAY_OF_WEEK);
//            System.out.println("day idx :"+ result2);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 884
    }

    public static int getADCentury(int century) {
        for (Map.Entry<Integer, ArrayList<Integer>> entry : anchorDaysMap.entrySet()) {
            if (entry.getValue().contains(Integer.valueOf(century))) {
                return entry.getKey();
            }
        }
        return 0;
    }
}

5

Có thể sử dụng đoạn mã sau cho đầu vào như (day = "08", tháng = "05", năm = "2015" và đầu ra sẽ là "WEDNESDAY")

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
calendar.set(Calendar.MONTH, (Integer.parseInt(month)-1));
calendar.set(Calendar.YEAR, Integer.parseInt(year));
String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();

1
Câu trả lời này không được khuyến khích, sử dụng thời gian cũ rắc rối mà giờ là di sản, được thay thế bởi các lớp java.time hiện đại.
Basil Bourque

1
Đây là câu hỏi được hỏi trên Hackerrank.
Prathamesh Thêm

5

Một dòng trả lời:

return LocalDate.parse("06/02/2018",DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();

Ví dụ sử dụng:

public static String getDayOfWeek(String date){
  return LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();
}

public static void callerMethod(){
   System.out.println(getDayOfWeek("06/02/2018")); //TUESDAY
}

Nó hoạt động, tôi chỉ cần thay thế .name () bằng getDisplayName (TextStyle.FULL, Locale.US)
Gastón Saillén

3
private String getDay(Date date){

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
    //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());                       
    return simpleDateFormat.format(date).toUpperCase();
}

private String getDay(String dateStr){
    //dateStr must be in DD-MM-YYYY Formate
    Date date = null;
    String day=null;

    try {
        date = new SimpleDateFormat("DD-MM-YYYY").parse(dateStr);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
        //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());
        day = simpleDateFormat.format(date).toUpperCase();


    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return day;
}

2
LocalDate date=LocalDate.now();

System.out.println(date.getDayOfWeek());//prints THURSDAY
System.out.println(date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US) );  //prints Thu   
java.time.DayOfWeek is a enum which returns the singleton instance for the day-of-week of the weekday of the date.

@Ayarnush Làm thế nào để Câu trả lời của bạn thêm bất kỳ giá trị nào ngoài Câu trả lời của Przemek được đăng vào tháng trước?
Basil Bourque

2

Có một thách thức về ngày và giờ Java của hackerrank

cá nhân, tôi thích lớp LocalDate.

  1. Nhập java.time.LocalDate
  2. Truy xuất localDate bằng cách sử dụng phương thức "of", có 3 đối số ở định dạng "int".
  3. cuối cùng, lấy tên của ngày hôm đó bằng phương thức "getDayOfWeek".

Có một video về thử thách này.

Giải pháp Hackerrank ngày và giờ Java

Tôi mong nó sẽ có ích :)


Nếu bất kỳ ai khác đến đây cho Ngày và Giờ Java của HackerRank và muốn sử dụng CalendarLớp đó , xin lưu ý rằng setphương thức trong Lịch mất vài tháng bắt đầu từ 0. tức là , 0 for January. Cảm ơn bạn!
Sagar Devkota

2

Thêm một cách khác để thực hiện chính xác những gì OP yêu cầu, mà không cần sử dụng các phương thức sẵn có mới nhất:

public static String getDay(String inputDate) {
    String dayOfWeek = null;
    String[] days = new String[]{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};

    try {
        SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy");
        Date dt1 = format1.parse(inputDate);
        dayOfWeek = days[dt1.getDay() - 1];
    } catch(Exception e) {
        System.out.println(e);
    }

    return dayOfWeek;
}

1
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
Alex Riabov

1
Đây là nhiều hơn một cách làm nản lòng. Mã của bạn không thể được biên dịch. Bạn không nên sử dụng các lớp lỗi thời và thiết kế kém SimpleDateFormatDate. Cụ thể, bạn không nên sử dụng getDayphương pháp không dùng nữa , nó không đáng tin cậy. Và bạn không nên sử dụng if- elseđể chọn trong số 7 giá trị, đây là giá trị chúng tôi có switchhoặc bạn có thể sử dụng một mảng. Tất cả trong tất cả các mã của bạn đều dài hơn và phức tạp hơn mức cần thiết.
Ole VV

1
Và sử dụng các chữ viết tắt tháng tích hợp thay vì cung cấp của riêng bạn. Đơn giản hơn và ít bị lỗi hơn.
Ole VV

1
Các lớp rắc rối được sử dụng ở đây đã được thay thế từ nhiều năm trước bởi các lớp java.time . Đề xuất sử dụng của họ trong năm 2018 là lời khuyên kém.
Basil Bourque

2
import java.text.SimpleDateFormat;
import java.util.Scanner;

class DayFromDate {

    public static void main(String args[]) {

        System.out.println("Enter the date(dd/mm/yyyy):");
        Scanner scan = new Scanner(System.in);
        String Date = scan.nextLine();

        try {
            boolean dateValid = dateValidate(Date);

            if(dateValid == true) {
                SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yy" );  
                java.util.Date date = df.parse( Date );   
                df.applyPattern( "EEE" );  
                String day= df.format( date ); 

                if(day.compareTo("Sat") == 0 || day.compareTo("Sun") == 0) {
                    System.out.println(day + ": Weekend");
                } else {
                    System.out.println(day + ": Weekday");
                }
            } else {
                System.out.println("Invalid Date!!!");
            }
        } catch(Exception e) {
            System.out.println("Invalid Date Formats!!!");
        }
     }

    static public boolean dateValidate(String d) {

        String dateArray[] = d.split("/");
        int day = Integer.parseInt(dateArray[0]);
        int month = Integer.parseInt(dateArray[1]);
        int year = Integer.parseInt(dateArray[2]);
        System.out.print(day + "\n" + month + "\n" + year + "\n");
        boolean leapYear = false;

        if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
            leapYear = true;
        }

        if(year > 2099 || year < 1900)
            return false;

        if(month < 13) {
            if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                if(day > 31)
                    return false;
            } else if(month == 4 || month == 6 || month == 9 || month == 11) {
                if(day > 30)
                    return false;
            } else if(leapYear == true && month == 2) {
                if(day > 29)
                    return false;
            } else if(leapYear == false && month == 2) {
                if(day > 28)
                    return false;
            }

            return true;    
        } else return false;
    }
}

2

Chương trình tìm ngày trong tuần bằng cách cho người dùng nhập ngày tháng và năm bằng java.util.scannergói:

import java.util.Scanner;

public class Calender {
    public static String getDay(String day, String month, String year) {

        int ym, yp, d, ay, a = 0;
        int by = 20;
        int[] y = new int[]{6, 4, 2, 0};
        int[] m = new int []{0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};

        String[] wd = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

        int gd = Integer.parseInt(day);
        int gm = Integer.parseInt(month);
        int gy = Integer.parseInt(year);

        ym = gy % 100;
        yp = ym / 4;
        ay = gy / 100;

        while (ay != by) {
            by = by + 1;
            a = a + 1;

            if(a == 4) {
                a = 0;
            }
        }

        if ((ym % 4 == 0) && (gm == 2)) {
            d = (gd + m[gm - 1] + ym + yp + y[a] - 1) % 7;
        } else
            d = (gd + m[gm - 1] + ym + yp + y[a]) % 7;

        return wd[d];
    }

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        String day = in.next();
        String month = in.next();
        String year = in.next();

        System.out.println(getDay(day, month, year));
    }
}

FYI, các lớp thời gian cũ rắc rối như java.util.Date, java.util.Calendarjava.text.SimpleDateFormathiện là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .
Basil Bourque

@Dave này có thực sự tốt để đọc? if ((ym%4==0) && (gm==2)){ d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
Pochmurnik

1
Calendar cal = Calendar.getInstance(desired date);
cal.setTimeInMillis(System.currentTimeMillis());
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

Nhận giá trị ngày bằng cách cung cấp dấu thời gian hiện tại.


1
//to get day of any date

import java.util.Scanner; 
import java.util.Calendar; 
import java.util.Date;

public class Show {

    public static String getDay(String day,String month, String year){


            String input_date = month+"/"+day+"/"+year;

            Date now = new Date(input_date);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(now);
            int final_day = (calendar.get(Calendar.DAY_OF_WEEK));

            String finalDay[]={"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};

            System.out.println(finalDay[final_day-1]);

    }

    public static void main(String[] args) { 
            Scanner in = new Scanner(System.in); 
            String month = in.next(); 
        String day = in.next();
            String year = in.next();

            getDay(day, month, year);
    }

}

2
Sẽ rất hữu ích khi thêm một số giải thích về câu trả lời để khen mã.
ritlew

1

phương thức bên dưới lấy ra bảy ngày và trả về tên ngày ngắn trong List Array trong Kotlin, tuy nhiên, bạn có thể định dạng lại sau đó ở định dạng Java, chỉ cần trình bày ý tưởng về cách Lịch có thể trả về tên ngắn

private fun getDayDisplayName():List<String>{
        val calendar = Calendar.getInstance()
        val dates= mutableListOf<String>()
        dates.clear()
        val s=   calendar.getDisplayName(DAY_OF_WEEK, SHORT, Locale.US)
        dates.add(s)
        for(i in 0..5){
            calendar.roll( Calendar.DATE, -1)
            dates.add(calendar.getDisplayName(DAY_OF_WEEK, SHORT, Locale.US))
        }
        return dates.toList()
    }

đưa ra kết quả như

I/System.out: Wed
    Tue
    Mon
    Sun
I/System.out: Sat
    Fri
    Thu

1
Nếu OP đang hỏi về Java, thì tốt nhất nên trả lời bằng Java.
mypetlion

1
Không có lý do tại sao chúng ta nên sử dụng Calendarlớp vào năm 2019. Nó được thiết kế kém và lỗi thời. Thay vào đó tôi khuyên dùng LocalDateDayOfWeektừ java.time, API ngày và giờ Java hiện đại .
Ole VV

0

Bạn có thể sử dụng phương pháp dưới đây để có được Ngày trong tuần bằng cách vượt qua một ngày cụ thể,

Ở đây đối với phương thức thiết lập của lớp Lịch, phần Tricky là chỉ mục cho tham số tháng sẽ bắt đầu từ 0 .

public static String getDay(int day, int month, int year) {

        Calendar cal = Calendar.getInstance();

        if(month==1){
            cal.set(year,0,day);
        }else{
            cal.set(year,month-1,day);
        }

        int dow = cal.get(Calendar.DAY_OF_WEEK);

        switch (dow) {
        case 1:
            return "SUNDAY";
        case 2:
            return "MONDAY";
        case 3:
            return "TUESDAY";
        case 4:
            return "WEDNESDAY";
        case 5:
            return "THURSDAY";
        case 6:
            return "FRIDAY";
        case 7:
            return "SATURDAY";
        default:
            System.out.println("GO To Hell....");
        }

        return null;
    }

3
Câu trả lời này không được khuyến khích, sử dụng các lớp thời gian cũ khủng khiếp mà bây giờ là di sản, được thay thế bởi các lớp java.time. Ngoài ra, mã này bỏ qua vấn đề quan trọng của múi giờ sau khi lúng túng áp dụng một lớp thời gian cho một vấn đề chỉ có ngày. Thay vào đó, hãy xem Câu trả lời đúng cho java.time của Przemek .
Basil Bourque

0

Lớp lịch có chức năng displayName tích hợp:

Calendar.getInstance().getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault()); // Thu   

Calendar.SHORT -> Thu
Calendar.LONG_FORMAT -> Thursday

Có sẵn kể từ Java 1.6. Xem thêm tài liệu của Oracle


0

Điều này hoạt động chính xác ...

java.time.LocalDate; //package related to time and date

Nó cung cấp phương thức sẵn có getDayOfWeek () để có được ngày của một tuần cụ thể:

int t;
Scanner s = new Scanner(System.in);
t = s.nextInt();
s.nextLine();
 while(t-->0) { 
    int d, m, y;
    String ss = s.nextLine();
    String []sss = ss.split(" ");
    d=Integer.parseInt(sss[0]);
    m = Integer.parseInt(sss[1]);
    y = Integer.parseInt(sss[2]);

    LocalDate l = LocalDate.of(y, m, d); //method to get the localdate instance
    System.out.println(l.getDayOfWeek()); //this returns the enum DayOfWeek

Để gán giá trị của enum l.getDayOfWeek()cho một chuỗi, có lẽ bạn có thể sử dụng phương thức Enum được gọi là name()trả về giá trị của đối tượng enum.


2
Câu trả lời trên Stack Overflow sẽ tốt hơn nếu chúng bao gồm một số giải thích cũng như đoạn mã.
Basil Bourque

@David, tôi đã tìm kiếm sự khác biệt trong chỉnh sửa của tôi và của bạn, tôi không thể tìm thấy nó. Sẽ rất tốt để có được thông tin làm thế nào để chỉnh sửa.
Pochmurnik

@OrdinaryDraft bạn đã thêm một listHolidays.add(LocalDate.of(year, 1, 1));câu trả lời. Nếu bạn muốn cải thiện câu trả lời, bạn nên thêm câu trả lời của riêng bạn. Hy vọng rằng sẽ giúp
David

Có, sau đó tôi đã kiểm tra chỉnh sửa của mình để so sánh với phiên bản của bạn. Có vẻ như tôi đã sao chép dòng đó do nhầm lẫn.
Pochmurnik

-3

Dưới đây là hai dòng đoạn trích sử dụng API thời gian Java 1.8 cho Yêu cầu của bạn.

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());

2
Cách tiếp cận được hiển thị ở đây đã được đề cập trong ít nhất 4 câu trả lời hay được đăng từ lâu. Tôi thấy không có giá trị gia tăng bởi bản sao này.
Basil Bourque
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.