Belirli bir tarihi geçerek haftanın gününü nasıl belirleyebilirim?


188

Örneğin şu tarihe sahibim: "23/2/2010" (23 Şubat 2010). Bunu haftanın gününü döndürecek bir işleve geçirmek istiyorum . Bunu nasıl yapabilirim?

Bu örnekte, işlev String"Sal" döndürmelidir .

Buna ek olarak, eğer sadece gündelik sıra isteniyorsa, bu nasıl geri alınabilir?

Yanıtlar:


350

Evet. Tam durumunuza bağlı olarak:

  • Şunları kullanabilirsiniz java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • çıktının Tue3 yerine olması gerekiyorsa (Haftanın günleri Pazar günü 1'den başlayarak dizine eklenir, bkz. Calendar.SUNDAY), bir takvimden geçmek yerine dizeyi yeniden biçimlendirin: new SimpleDateFormat("EE").format(date)( EE"" gün günü, kısa sürüm " )

  • girdiniz yerine dize olarak Datevarsa SimpleDateFormatayrıştırmak için şunu kullanmalısınız :new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • joda-time DateTimeve call dateTime.dayOfWeek()ve / veya kullanabilirsiniz DateTimeFormat.

  • edit: Java 8'den beri artık joda-time yerine java.time paketini kullanabilirsiniz


20
Haftanın günleri Pazar olan 1'den başlar, bu yüzden Salı 3 olur.
Mohammad Banisaeid

13
Dikkat edilmesi gereken diğer şeylerde, Takvim nesnesindeki tarihi tamsayılar kullanarak (bir dize ayrıştırma yoluyla değil) ayarlarsanız, ay sayısının sıfır temelli olduğunu unutmayın, bu nedenle Ocak 0 ve Aralık 11'dir.
RenniePet

4
@RenniePet: İyi olan. Ayrıca Calendarsınıftaki Calendar.SUNDAYveya gibi sabitleri de kullanabilirsiniz Calendar.JANUARY.
Mohammad Banisaeid

2
Bu cevap yazıldığı zaman harika bir cevaptı. Bugün artık modası geçmiş sınıflar isteyeceksiniz Calendar, Dateve DateTimeFormat(ve çok Joda zamanı) ve Java 8 kullanan java.timeörneğin sınıflar YearMonthveya LocalDate. Bu yanıtta daha fazlasını görün .
Ole VV

4
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Oracle tarafından Öğreticisi .
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);

Bir giriş tarihinden itibaren Gün adını bulmak için bu kodu kullanın.


1
Bu yöntemi kullanırsanız, gün ve ayların sırasına dikkat edin.
Joel Christophel

1
Bence bir deneme yakalama bloğuna koymanız gerekiyor
Shafaet

1
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Oracle tarafından Öğreticisi .
Basil Bourque

Android, API 26'dan sonra yalnızca LocalDate uygular.
Jacob Sánchez

29

Basitçe SimpleDateFormat kullanın .

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

Sonuç: Cmt, 28 Ara 2013

Varsayılan yapıcı "varsayılan" Yerel ayarını alır, bu nedenle belirli bir desene ihtiyacınız olduğunda onu kullanmaya dikkat edin.

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

21

tl; Dr.

Kullanılması 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.
         ) 

Sal

IdeOne.com'da canlı olarak çalıştırılan bu koda bakın (ancak sadece Locale.USorada çalışır).

java.time

Yukarıdaki örnek koduma bakın ve Przemek tarafından java.time için doğru cevaba bakın .

Sıra numarası

eğer sadece sıra sıra isteniyorsa, bu nasıl geri alınabilir?

Sıra sayısı için, DayOfWeekbunun yerine numaralandırma nesnesinin etrafından geçmeyi düşünün DayOfWeek.TUESDAY. A'nın DayOfWeekyalnızca bir dize veya yalnızca bir tam sayı değil akıllı bir nesne olduğunu unutmayın . Bu numaralandırma nesnelerini kullanmak , kodunuzu daha fazla kendi kendine belgelendirir, geçerli değerler sağlar ve tür güvenliği sağlar .

Ama ısrar ediyorsanız, bir numara isteyinDayOfWeek . ISO 8601 standardına göre pazartesi-pazar günleri için 1-7 puan alırsınız .

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

Joda-Time

GÜNCELLEME: Joda-Time projesi şimdi bakım modunda. Ekip, java.time derslerine geçilmesini tavsiye ediyor. Java.time çerçevesi Java 8'de yerleşiktir ( Java 6 ve 7'ye geri taşınmıştır ve Android'e uyarlanmıştır ).

İşte Bozho'nun kabul ettiği cevapta belirtildiği gibi Joda-Time kitaplığı sürüm 2.4'ü kullanan örnek kod . Joda-Time, Java ile birlikte gelen java.util.Date/.Calendar sınıflarından çok daha üstündür.

LocalDate

Joda-Time, LocalDatesınıfa günün herhangi bir saati veya saat dilimi olmadan yalnızca bir tarihi temsil etmesini sağlar. Tam olarak bu sorunun ne istediğini. Java ile birlikte gelen eski java.util.Date/.Calendar sınıflarında bu kavram yoktur.

Ayrıştırma

Dizeyi bir tarih değerine ayrıştırın.

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

Ayıkla

Tarih değerinden haftanın gün numarası ve adını ayıklayı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 );

çöplük

Konsola dökümü.

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

Çalıştırmak

Çalıştırıldığında.

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

Java.time hakkında

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time sınıflarını nereden edinebilirsiniz?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


15

java.time

java.timeJava 8 ve sonraki sürümlerinde yerleşik çerçeve kullanma .

Enum otomatik İnsan dilinin ve kültürel normlara lokalize günün adının bir dize oluşturabilir . Uzun form veya kısaltılmış ad istediğinizi belirtmek için bir belirtin .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
Bu sadece Oreo ve apis üzerinde kullanılabilir.
kod yazarı

2
@codepeaker Java.time işlevselliğinin çoğu , ThreeTen-Backport projesinde Java 6 ve Java 7'ye geri yüklenmiştir . Daha önceki ThreeTenABP Android (<26) için uyarlanmıştır . Bkz . ThreeTenABP nasıl kullanılır… .
Basil Bourque

9

Aşağıdaki kodu deneyebilirsiniz:

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

Bu cevap, önceki iki veya üç cevabın ötesinde nasıl değer katar LocalDate? Göndermeden önce bunları okudun mu?
Basil Bourque

1
Bu iyi bir cevap ve öncekilerden farklı. Tarihi oluşturmak için LocalDate.of () API'sini kullanır ve diğer çoğu yanıttan çok daha kısadır (bazen kısa cevap
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);
    }
}

güzel bir çözüm, tam olarak bu tür bir çözüm buluyordum, Sorunumu çözen gerekli hattım. Dize dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammed Azam

9

İçin Daha sonra Java 8 veya , LOCALDATE tercih edilir

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

Not: giriş Dize / Kullanıcı tanımlıysa, int olarak ayrıştırmalısınız .


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

Başka bir "eğlenceli" yol Kıyamet algoritması kullanmaktır . Bu çok daha uzun bir yöntemdir, ancak belirli bir tarihe sahip bir Takvim nesnesi oluşturmanız gerekmiyorsa da daha hızlıdır.

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

Gibi girişler için aşağıdaki kod snippet'ini kullanabilir (gün = "08", ay = "05", yıl = "2015" ve çıktı "ÇARŞAMBA" olacaktır)

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
Bu cevap, modern java.time sınıfları tarafından desteklenen, artık eski olan zahmetli eski tarih-saat kullanılarak tavsiye edilmez.
Basil Bourque

1
Hackerrank'ta sorulan soru bu.
Prathamesh Daha fazla

5

Bir satır cevap:

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

Kullanım Örneği:

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
}

İşe yaradı, sadece .name () yerine getDisplayName (TextStyle.FULL, Locale.US) ile değiştirmem gerekiyordu
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 Yanıtınız geçen ay yayınlanan Cevapla ötesinde nasıl bir değer katıyor ?
Basil Bourque

2

Hacker Java Tarih ve Saatinde bir meydan okuma var

Şahsen ben LocalDate sınıfını tercih ediyorum.

  1. Java.time.LocalDate dosyasını içe aktarın
  2. "İnt" biçiminde 3 bağımsız değişken alan "of" yöntemini kullanarak localDate dosyasını alın.
  3. son olarak, "getDayOfWeek" yöntemini kullanarak o günün adını alın.

Bu zorlukla ilgili bir video var.

Java Tarih ve Saat Hackerrank çözümü

Umarım yardımcı olur :)


HackerRank Java Tarih ve Saati için buraya gelen başka biri varsa ve bu CalendarSınıfı kullanmak istiyorsanız set, Takvim'deki yöntemin 0'dan başlayarak aylar aldığını lütfen unutmayın 0 for January. Teşekkür ederim!
Sagar Devkota

2

En son dahili yöntemleri kullanmadan OP'nin istediği şeyi yapmanın başka bir yolunu eklemek:

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
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
Alex Riabov

1
Bu, bunu yapmanın cesaret kırıcı yolunun birden fazla yoludur. Kodunuz derlenemez. Uzun modası geçmiş ve kötü tasarlanmış sınıfları kullanmamalısınız SimpleDateFormatve Date. Özellikle kullanımdan kaldırılmış getDayyöntemi kullanmamalısınız, güvenilir değildir. Ve kullanmamalısınız if- else7 değer arasından seçim yapmak switchiçin sahip olduğumuz şey budur , ya da bir dizi kullanabilirsiniz. Sonuç olarak, kodunuz gerekenden daha uzun ve daha karmaşıktır.
Ole VV

1
Ve kendi ayınızı sağlamak yerine yerleşik ay kısaltmalarını kullanın. Daha basit ve daha az hataya açık.
Ole VV

1
Burada kullanılan zahmetli dersler yıllar önce java.time dersleri ile tamamlandı. 2018'de kullanımlarını önermek kötü tavsiye.
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

Program, java.util.scannerpaketi kullanarak kullanıcı giriş tarihini ay ve yıl vererek haftanın gününü bulmak için :

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

Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Oracle tarafından Öğreticisi .
Basil Bourque

@Dave okumak gerçekten güzel mi? 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);

Geçerli zaman damgasını girerek gün değerini alın.


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
Kodu tamamlamak için cevabın bazı açıklamalarını eklemek yararlı olacaktır.
ritlew

1

Aşağıdaki yöntem, yedi gün alır ve Kotlin'deki Liste Dizisi'nde günlerin kısa adını döndürür, ancak yalnızca Java biçiminde yeniden biçimlendirebilir ve Takvim'in kısa adı nasıl döndürebileceği fikrini sunabilirsiniz.

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

gibi sonuçlar ortaya koymak

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

1
OP Java hakkında soruyorsa, Java ile yanıt vermek en iyisidir.
mypetlion

1
CalendarSınıfı 2019'da kullanmak istemememiz için hiçbir neden yok . Kötü tasarlanmış ve çok eski. Bunun yerine tavsiye LocalDateve DayOfWeekgelen modern Java tarih ve saat API java.time .
Ole VV

0

Belirli bir tarihi geçirerek Haftanın Günü'nü almak için aşağıdaki yöntemi kullanabilirsiniz,

Burada Calendar sınıfının ayarlanan yöntemi için Tricky part, month parametresinin 0'dan başlayacağı dizindir .

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
Bu cevap, artık eski olan, java.time sınıfları tarafından desteklenen korkunç eski tarih-saat sınıfları kullanılarak tavsiye edilmez. Ayrıca, bu kod, bir tarih-saat sınıfını yalnızca bir tarih sorununa garip bir şekilde uyguladıktan sonra saat diliminin önemli sorununu yoksayar. Bunun yerine Przemek'in java.time için doğru cevabına bakınız .
Basil Bourque

0

Takvim sınıfında yerleşik displayName işlevi vardır:

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

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

Java 1.6'dan beri kullanılabilir. Ayrıca bkz. Oracle belgeleri


0

Bu doğru çalışıyor ...

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

Belirli bir haftanın gününü almak için dahili getDayOfWeek () yöntemi sağlar:

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

l.getDayOfWeek()Bir dizeye enum değerini atamak için , büyük olasılıkla name()enum nesnesinin değerini döndüren Enum yöntemini kullanabilirsiniz .


2
Yığın Taşması üzerindeki yanıtlar, kod snippet'inin yanı sıra bazı açıklamalar da içeriyorsa daha iyidir.
Basil Bourque

@David, düzenlememde ve seninkinde fark arıyorum, bulamıyorum. Düzenleme hakkında bilgi almak güzel olurdu.
Pochmurnik

@OrdinaryDraft cevaba bir a eklediniz listHolidays.add(LocalDate.of(year, 1, 1));. Cevabı geliştirmek istiyorsanız, kendi cevabınızı eklemelisiniz. Umut yardımcı olur
David

Evet, daha sonra sürümünüzle karşılaştırmak için düzenlememi kontrol ettim. Görünen o ki yanlışlıkla bu satırı kopyaladım.
Pochmurnik

-3

Gereksiniminiz için Java 1.8 Time API'sini kullanan iki snippet satırı aşağıdadır.

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

2
Burada gösterilen yaklaşım, uzun zaman önce yayınlanan en az 4 iyi Cevapta zaten ele alınmıştır. Bu kopya tarafından katma değer görmüyorum.
Basil Bourque
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.