วิธีการกำหนดวันในสัปดาห์โดยผ่านวันที่ที่ระบุ?


188

ตัวอย่างเช่นฉันมีวันที่: "23/2/2010" (23 กุมภาพันธ์ 2010) ฉันต้องการที่จะผ่านไปยังฟังก์ชั่นที่จะกลับมาเป็นวันของสัปดาห์ ฉันจะทำสิ่งนี้ได้อย่างไร

ในตัวอย่างนี้ฟังก์ชั่นควรกลับString"อ."

นอกจากนี้หากต้องการเพียงลำดับวันก็จะสามารถเรียกดูได้อย่างไร

คำตอบ:


350

ใช่. ขึ้นอยู่กับกรณีของคุณ:

  • คุณสามารถใช้java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • หากคุณต้องการผลลัพธ์ที่จะเป็นTueมากกว่า 3 (วันของสัปดาห์ที่มีการจัดทำดัชนีเริ่มต้นที่ 1 สำหรับวันอาทิตย์ให้ดูที่ Calendar.SUNDAY) แทนที่จะไปตามปฏิทินเพียงแค่ฟอร์แมตสตริงใหม่: new SimpleDateFormat("EE").format(date)( EEหมายถึง "วันในสัปดาห์รุ่นสั้น" )

  • หากคุณมีการป้อนข้อมูลของคุณเป็นสตริงมากกว่าDateคุณควรใช้SimpleDateFormatในการแยกวิเคราะห์:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • คุณสามารถใช้ Joda-เวลาDateTimeและโทรและdateTime.dayOfWeek() / หรือDateTimeFormat

  • แก้ไข: ตั้งแต่ Java 8 คุณสามารถใช้แพ็คเกจ java.time แทน joda-time


20
วันของสัปดาห์เริ่มจากวันที่ 1 ซึ่งเป็นวันอาทิตย์ดังนั้นฉันคิดว่าอ. จะเป็น 3
Mohammad Banisaeid

13
ในสิ่งอื่น ๆ ที่ต้องระวังหากคุณตั้งค่าวันที่ในวัตถุปฏิทินโดยใช้จำนวนเต็ม (ไม่ใช่ผ่านการแยกสตริง) โปรดทราบว่าหมายเลขเดือนเป็นศูนย์ดังนั้นเดือนมกราคมคือ 0 และธันวาคมคือ 11
RenniePet

4
@RenniePet: ทำได้ดีมาก นอกจากนี้คุณสามารถใช้ค่าคงที่ในCalendarระดับเช่นหรือCalendar.SUNDAY Calendar.JANUARY
Mohammad Banisaeid

2
คำตอบนี้เป็นคำตอบที่ดีเมื่อเขียน วันนี้คุณจะต้องการที่จะเรียนล้าสมัยในขณะนี้Calendar, DateและDateTimeFormat(และเวลา Joda เกินไป) และใช้ Java 8 java.timeชั้นเรียนเช่นหรือYearMonth LocalDateดูเพิ่มเติมในคำตอบนี้
Ole VV

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

68
  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);

ใช้รหัสนี้เพื่อค้นหาชื่อวันจากวันที่ป้อนง่ายและผ่านการทดสอบอย่างดี


1
หากคุณใช้วิธีนี้จดบันทึกลำดับวันและเดือนอย่างระมัดระวัง
Joel Christophel

1
ฉันคิดว่าคุณต้องใส่มันเข้าไปใน catch catch block
Shafaet

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

Android ใช้ LocalDate หลังจาก API 26 เท่านั้น
Jacob Sánchez

29

เพียงแค่ใช้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);

ผลลัพธ์คือ: Sat, 28 Dec 2013

ตัวสร้างเริ่มต้นคือการ "เริ่มต้น" สถานที่เกิดเหตุจึงควรระมัดระวังการใช้มันเมื่อคุณต้องการรูปแบบที่เฉพาะเจาะจง

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

21

TL; DR

กำลังใช้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.
         ) 

อังคาร

ดูรหัสนี้ทำงานจริงได้ที่ IdeOne.com ( Locale.USทำงานได้ที่นั่นเท่านั้น)

java.time

ดูรหัสตัวอย่างของฉันข้างต้นและดูคำตอบที่ถูกต้องสำหรับ java.time โดย Przemek

เลขลำดับ

หากต้องการเพียงลำดับวันก็จะสามารถเรียกคืนสิ่งนั้นได้อย่างไร

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

แต่ถ้าคุณยืนยันถามDayOfWeekสำหรับตัวเลข คุณจะได้รับ 1-7 วันจันทร์ถึงวันอาทิตย์ตามมาตรฐาน ISO 8601มาตรฐาน

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

Joda เวลา

UPDATE:โครงการ Joda-Time อยู่ในโหมดบำรุงรักษา ทีมให้คำแนะนำการโยกย้ายไปยังคลาส java.time เฟรมเวิร์ก java.time สร้างขึ้นใน Java 8 (รวมถึงback-ported ไปยัง Java 6 & 7และปรับให้เข้ากับ Android เพิ่มเติม )

นี่คือตัวอย่างรหัสใช้Joda เวลาห้องสมุดรุ่น 2.4 ตามที่กล่าวไว้ในคำตอบที่ได้รับการยอมรับโดย Bozho Joda-Time นั้นเหนือกว่าคลาส java.util.Date/.Calendar ที่มาพร้อมกับ Java

LocalDate

Joda-Time เสนอ LocalDateชั้นเรียนเพื่อเป็นตัวแทนของวันที่เท่านั้นโดยไม่มีช่วงเวลาของวันหรือเขตเวลา สิ่งที่คำถามนี้เรียกร้อง คลาส java.util.Date/.Calendar เก่าที่มาพร้อมกับ Java ไม่มีแนวคิดนี้

การแยกวิเคราะห์

แยกสตริงเป็นค่าวันที่

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

สารสกัด

แยกออกมาจากค่าวันที่วันที่จำนวนสัปดาห์และชื่อ

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

เท

ถ่ายโอนข้อมูลไปยังคอนโซล

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

วิ่ง

เมื่อวิ่ง

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

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

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

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

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

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

  • Java SE 8 , Java SE 9และใหม่กว่า
    • Built-in
    • เป็นส่วนหนึ่งของ 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และอื่น ๆ อีกมากมาย


15

java.time

การใช้java.timeเฟรมเวิร์กใน Java 8 และใหม่กว่า

enumสามารถสร้าง String ชื่อของวันที่มีการแปลโดยอัตโนมัติไปยังภาษามนุษย์และบรรทัดฐานทางวัฒนธรรมของ ระบุ a เพื่อระบุว่าคุณต้องการชื่อแบบยาวหรือตัวย่อ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
สามารถใช้ได้เฉพาะใน Oreo และ apis ด้านบน
codepeaker

2
@codepeaker ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 & Java 7 ในThreeTen-ย้ายกลับโครงการ ดัดแปลงเพิ่มเติมสำหรับก่อนหน้านี้ Android (<26) ในThreeTenABP ดูวิธีการใช้ ThreeTenABP … .
Basil Bourque

9

คุณสามารถลองรหัสต่อไปนี้:

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

คำตอบนี้เพิ่มมูลค่าได้อย่างไรเมื่อเทียบกับคำตอบก่อนหน้านี้สองหรือสามข้อที่ใช้LocalDate? คุณได้อ่านสิ่งเหล่านั้นก่อนโพสต์หรือไม่?
Basil Bourque

1
นี่เป็นคำตอบที่ดีและแตกต่างจากคำตอบก่อนหน้านี้ทั้งหมด มันใช้ LocalDate.of () API เพื่อสร้างวันที่และมันสั้นกว่าคำตอบอื่น ๆ ส่วนใหญ่ (บางครั้งคำตอบสั้น ๆ ก็ดีกว่ายาว) ...
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);
    }
}

วิธีแก้ปัญหาที่ดีฉันกำลังหาวิธีแก้ปัญหาประเภทนี้อย่างแน่นอนบรรทัดที่ต้องการของฉันที่แก้ไขปัญหาของฉันได้ String dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
มูฮัมหมัดอาซัม

9

สำหรับJava 8 หรือใหม่กว่าLocaldateจะดีกว่า

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

หมายเหตุ:ถ้าใส่เป็นสตริง / ผู้ใช้กำหนดแล้วคุณควรจะแยกลงใน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

อีกวิธีที่ "สนุก" คือการใช้อัลกอริทึม Doomsdayอัลกอริทึมวันโลกาวินาศมันเป็นวิธีที่ยาวกว่า แต่ก็เร็วขึ้นถ้าคุณไม่ต้องการสร้างวัตถุปฏิทินด้วยวันที่ที่กำหนด

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

สามารถใช้ข้อมูลโค้ดต่อไปนี้สำหรับการป้อนข้อมูลเช่น (day = "08", month = "05", year = "2015" และผลลัพธ์จะเป็น "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
คำตอบนี้เป็นคำแนะนำที่ไม่ดีโดยใช้วันที่และเวลาเก่าที่เป็นปัญหาซึ่งถูกแทนที่ด้วยคลาส java.time ที่ทันสมัย
Basil Bourque

1
นี่คือคำถามที่ถามเกี่ยวกับแฮ็กเกอร์
Prathamesh เพิ่มเติม

5

คำตอบหนึ่งบรรทัด:

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

ตัวอย่างการใช้งาน:

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
}

มันใช้งานได้ฉันแค่ต้องการแทนที่. name () ด้วย getDisplayName (TextStyle.FULL, Locale.US)
GastónSaillé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 คำตอบของคุณเพิ่มคุณค่าใด ๆ นอกเหนือจากคำตอบโดย Przemek ที่โพสต์เมื่อเดือนที่แล้ว
Basil Bourque

2

มีความท้าทายเกี่ยวกับแฮกเกอร์ธนาคารJava วันที่และเวลา

ส่วนตัวฉันชอบชั้น LocalDate

  1. นำเข้า java.time.LocalDate
  2. ดึง localDate โดยใช้วิธีการ "ของ" ซึ่งใช้เวลา 3 ข้อโต้แย้งในรูปแบบ "int"
  3. ในที่สุดรับชื่อของวันนั้นโดยใช้วิธี "getDayOfWeek"

มีวิดีโอหนึ่งเรื่องเกี่ยวกับความท้าทายนี้

โซลูชัน Java วันที่และเวลาแฮกเกอร์

ฉันหวังว่ามันจะช่วย :)


หากอื่น ๆ มาที่นี่สำหรับ HackerRank Java วันและเวลาและต้องการใช้ที่Calendarชั้นโปรดทราบว่าsetวิธีการในปฏิทินเวลาเดือนเริ่มต้นจาก 0. 0 for Januaryคือ ขอบคุณ!
Sagar Devkota

2

การเพิ่มวิธีอื่นในการทำสิ่งที่ OP ต้องการโดยไม่ต้องใช้วิธีการ inbuilt ล่าสุด:

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
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
Alex Riabov

1
นี่เป็นวิธีที่ท้อแท้มากกว่าหนึ่งวิธี รหัสของคุณไม่สามารถรวบรวมได้ คุณไม่ควรใช้เวลานานและล้าสมัยออกแบบมาไม่ดีเรียนและSimpleDateFormat Dateโดยเฉพาะอย่างยิ่งคุณไม่ควรใช้getDayวิธีที่คัดค้านมันไม่น่าเชื่อถือ และคุณไม่ควรใช้if- elseสำหรับการเลือกในหมู่ 7 ค่านี้สิ่งที่เรามีswitchหรือคุณอาจจะใช้อาร์เรย์ รหัสทั้งหมดของคุณนั้นมีความยาวและซับซ้อนกว่าที่คุณต้องการ
Ole VV

1
และใช้ตัวย่อแบบเดือนในตัวแทนที่จะใช้ตัวคุณเอง เรียบง่ายและผิดพลาดน้อยลง
Ole VV

1
คลาสที่มีปัญหาซึ่งใช้ที่นี่ถูกแทนที่ด้วยคลาสjava.time เมื่อหลายปีก่อน แนะนำให้ใช้ในปี 2561 เป็นคำแนะนำที่ไม่ดี
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

โปรแกรมเพื่อค้นหาวันในสัปดาห์โดยให้วันที่ป้อนข้อมูลของผู้ใช้เดือนและปีโดยใช้java.util.scannerแพ็คเกจ:

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

@Dave นี่มันดีมากที่จะอ่าน? 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);

รับค่าวันด้วยการระบุการประทับเวลาปัจจุบัน


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
มันจะมีประโยชน์ในการเพิ่มคำอธิบายของคำตอบเพื่อชมเชยโค้ด
ritlew

1

วิธีการด้านล่างดึงเจ็ดวันและส่งกลับชื่อสั้น ๆ ของวันใน List Array ใน Kotlin แต่คุณสามารถฟอร์แมตใหม่แล้วในรูปแบบ Java นำเสนอแนวคิดว่าปฏิทินสามารถส่งคืนชื่อสั้น ๆ ได้อย่างไร

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()
    }

ออกผลใส่เช่น

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

1
ถ้า OP ถามเกี่ยวกับ Java ดังนั้นจะเป็นการดีที่สุดที่จะตอบกลับด้วย Java
mypetlion

1
ไม่มีเหตุผลว่าทำไมเราควรต้องการใช้Calendarคลาสในปี 2019 มันออกแบบมาไม่ดีและล้าสมัยไปนาน แต่ผมขอแนะนำให้LocalDateและDayOfWeekจากjava.time ทันสมัย Java วันที่และเวลา API
Ole VV

0

คุณสามารถใช้วิธีการด้านล่างเพื่อรับวันในสัปดาห์โดยผ่านวันที่ระบุ

ที่นี่สำหรับวิธีการตั้งค่าของคลาสปฏิทินส่วนที่ยุ่งยากคือดัชนีสำหรับพารามิเตอร์ประจำเดือนจะเริ่มจาก 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
คำตอบนี้เป็นคำแนะนำที่ไม่ดีโดยใช้คลาสวันและเวลาเก่าที่แย่ซึ่งตอนนี้เป็นแบบดั้งเดิมแทนที่ด้วยคลาส java.time นอกจากนี้โค้ดนี้จะไม่สนใจปัญหาที่สำคัญของเขตเวลาหลังจากนำคลาสวันที่ไปใช้กับปัญหาเฉพาะวันที่อย่างเชื่องช้า แต่เห็นคำตอบที่ถูกต้องสำหรับ java.time โดย Przemek
Basil Bourque

0

คลาสปฏิทินมีฟังก์ชันการทำงาน displayName ในตัว:

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

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

มีให้ตั้งแต่ Java 1.6 ดูเอกสารของ Oracle


0

ทำงานอย่างถูกต้อง ...

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

มันให้วิธีการ inbuilt getDayOfWeek () เพื่อรับวันในสัปดาห์ที่เฉพาะเจาะจง:

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

ในการกำหนดค่าของ enum l.getDayOfWeek()ให้กับสตริงคุณอาจใช้วิธีการ Enum ที่เรียกname()ว่าคืนค่าของวัตถุ enum


2
รู้รอบใน Stack Overflow จะดีกว่าหากมีคำอธิบายบางอย่างรวมถึงข้อมูลโค้ด
Basil Bourque

@ David ฉันได้ค้นหาความแตกต่างในการแก้ไขของฉันและของคุณฉันไม่พบมัน ยินดีที่ได้รับข้อมูลวิธีการแก้ไข
Pochmurnik

@OrdinaryDraft ที่คุณเพิ่มlistHolidays.add(LocalDate.of(year, 1, 1));ไปยังคำตอบ หากคุณต้องการปรับปรุงคำตอบคุณควรเพิ่มของคุณเอง หวังว่าจะช่วยได้
David

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

-3

ด้านล่างเป็นตัวอย่างข้อมูลสองบรรทัดโดยใช้ Java 1.8 Time API สำหรับความต้องการของคุณ

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

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