Bagaimana cara menentukan hari dalam seminggu dengan melewati tanggal tertentu?

188

Sebagai contoh, saya memiliki tanggal: "23/2/2010" (23 Feb 2010). Saya ingin meneruskannya ke fungsi yang akan mengembalikan hari dalam seminggu . Bagaimana saya bisa melakukan ini?

Dalam contoh ini, fungsi harus mengembalikan String"Sel".

Selain itu, jika hanya ordinal hari yang diinginkan, bagaimana itu bisa diambil?

evilReiko
sumber

Jawaban:

350

Iya. Bergantung pada kasus persis Anda:

  • Anda bisa menggunakan java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • jika Anda membutuhkan output Tuelebih dari 3 (Hari dalam seminggu diindeks mulai dari 1 untuk Minggu, lihat Kalender. MINGGU), alih-alih melalui kalender, cukup format ulang string: new SimpleDateFormat("EE").format(date)( EEartinya "hari dalam seminggu, versi singkat" )

  • jika Anda memiliki input sebagai string Date, Anda harus menggunakannya SimpleDateFormatuntuk menguraikannya:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • Anda dapat menggunakan joda-time DateTimedan menelepon dateTime.dayOfWeek()dan / atau DateTimeFormat.

  • sunting: sejak Java 8 Anda sekarang dapat menggunakan paket java.time alih-alih joda-time

Bozho
sumber
20
Hari-hari dalam seminggu dimulai dari 1 yang merupakan hari Minggu, jadi saya pikir Sel akan menjadi 3.
Mohammad Banisaeid
13
Dalam hal lain yang harus diperhatikan, jika Anda menetapkan tanggal di objek Kalender menggunakan bilangan bulat (bukan melalui parsing string), maka perlu diketahui bahwa angka bulan berbasis nol, jadi Januari adalah 0 dan Desember adalah 11.
RenniePet
4
@RenniePet: Bagus Anda juga dapat menggunakan konstanta di Calendarkelas, seperti Calendar.SUNDAYatau Calendar.JANUARY.
Mohammad Banisaeid
2
Jawaban ini adalah jawaban yang bagus ketika ditulis. Hari ini Anda akan ingin kelas yang sudah usang Calendar, Datedan DateTimeFormat(dan juga waktu Joda) dan menggunakan kelas Java 8 java.time, misalnya YearMonthatau LocalDate. Lihat lebih banyak di jawaban ini .
Ole VV
4
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
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);

Gunakan kode ini untuk menemukan nama Hari dari tanggal input. Sederhana dan teruji dengan baik.

JDGuide
sumber
1
Jika Anda menggunakan metode ini, perhatikan urutan hari dan bulan.
Joel Christophel
1
Saya pikir Anda perlu memasukkannya ke dalam blok coba tangkap
Shafaet
1
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
Basil Bourque
Android hanya mengimplementasikan LocalDate setelah API 26.
Jacob Sánchez
29

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

Hasilnya adalah: Sabtu, 28 Des 2013

Konstruktor default mengambil Lokal "default" , jadi berhati-hatilah menggunakannya ketika Anda membutuhkan pola tertentu.

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

tl; dr

Menggunakan 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.
         ) 

Sel

Lihat kode ini berjalan langsung di IdeOne.com (tetapi hanya Locale.USberfungsi di sana).

waktu java

Lihat contoh kode saya di atas, dan lihat Jawaban yang benar untuk java.time oleh Przemek .

Nomor urut

jika hanya hari yang diinginkan, bagaimana itu bisa diambil?

Untuk bilangan urut, pertimbangkan untuk melewatkan DayOfWeekobjek enum seperti DayOfWeek.TUESDAY. Perlu diingat bahwa a DayOfWeekadalah objek yang cerdas, bukan hanya string atau angka integer belaka. Menggunakan objek enum tersebut membuat kode Anda lebih banyak mendokumentasikan diri sendiri, memastikan nilai yang valid, dan memberikan keamanan jenis .

Tetapi jika Anda bersikeras, mintalah DayOfWeeknomor . Anda mendapatkan 1-7 untuk Senin-Minggu per standar ISO 8601 .

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

Joda-Time

UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan. Tim menyarankan migrasi ke kelas java.time. Kerangka java.time dibangun ke Java 8 (serta porting kembali ke Java 6 & 7 dan selanjutnya diadaptasi ke Android ).

Berikut adalah contoh kode menggunakan perpustakaan Joda-Time versi 2.4, sebagaimana disebutkan dalam jawaban yang diterima oleh Bozho . Joda-Time jauh lebih unggul dari kelas java.util.Date/.Calendar yang dibundel dengan Java.

LocalDate

Joda-Time menawarkan LocalDatekelas untuk mewakili tanggal saja tanpa zona waktu atau waktu. Apa yang ditanyakan oleh Pertanyaan ini. Kelas java.util.Date/.Calendar tua yang dibundel dengan Java tidak memiliki konsep ini.

Parse

Parsing string menjadi nilai tanggal.

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

Ekstrak

Ekstrak dari nilai tanggal hari nomor dan nama minggu.

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

Membuang

Dump ke konsol.

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

Lari

Saat dijalankan.

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

Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .

Basil Bourque
sumber
15

waktu java

Menggunakan java.timeframework yang dibangun ke Java 8 dan yang lebih baru.

The enum dapat menghasilkan String dari nama hari secara otomatis diterjemahkan ke bahasa manusia dan norma-norma budaya dari . Tentukan untuk menunjukkan Anda ingin bentuk panjang atau nama disingkat.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
Przemek
sumber
1
Ini hanya dapat digunakan di Oreo dan di atas apis.
codepeaker
2
@codepeaker Sebagian besar fungsi java.time di -porting ke Java 6 & Java 7 di proyek ThreeTen-Backport . Lebih lanjut diadaptasi untuk Android sebelumnya (<26) di ThreeTenABP . Lihat Cara menggunakan ThreeTenABP… .
Basil Bourque
9

Anda dapat mencoba kode berikut:

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));
   }
}
SHB
sumber
Bagaimana jawaban ini menambah nilai di luar dua atau tiga jawaban sebelumnya yang digunakan LocalDate? Apakah Anda membaca itu sebelum memposting?
Basil Bourque
1
Ini adalah jawaban yang bagus, dan ini berbeda dari semua yang sebelumnya. Ini menggunakan LocalDate.of () API untuk membuat tanggal, dan itu jauh lebih pendek daripada kebanyakan jawaban lain (kadang-kadang jawaban pendek lebih baik daripada panjang) ...
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);
    }
}
hitesh
sumber
solusi yang bagus, saya menemukan solusi jenis ini, jalur yang saya butuhkan yang memecahkan masalah saya. String dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam
9

Untuk Java 8 atau lebih baru , Localdate lebih disukai

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

Catatan: jika input adalah String / Pengguna ditentukan, maka Anda harus menguraikannya menjadi int .

MST
sumber
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());
Ramesh Thoutam
sumber
5

Cara "asyik" lainnya adalah dengan menggunakan algoritme Kiamat . Ini metode yang jauh lebih lama tetapi juga lebih cepat jika Anda tidak perlu membuat objek Kalender dengan tanggal tertentu.

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;
    }
}
alain.janinm
sumber
5

Dapat menggunakan potongan kode berikut untuk input seperti (hari = "08", bulan = "05", tahun = "2015" dan output akan menjadi "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();
rab
sumber
1
Jawaban ini keliru, menggunakan tanggal lama yang merepotkan yang sekarang merupakan warisan, digantikan oleh kelas java.time modern.
Basil Bourque
1
Ini adalah pertanyaan yang diajukan di Hackerrank.
Prathamesh Lebih Banyak
5

Satu jawaban baris:

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

Contoh Penggunaan:

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
}
Sahil Chhabra
sumber
Berhasil, saya hanya perlu mengganti .name () dengan 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;
}
Az.MaYo
sumber
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.
Ayarnish
sumber
@Ayarnush Bagaimana Jawaban Anda menambahkan nilai di luar Jawaban yang diposkan oleh Przemek bulan lalu?
Basil Bourque
2

Ada tantangan pada tanggal dan waktu Java hackerrank

secara pribadi, saya lebih suka kelas LocalDate.

  1. Impor java.time.LocalDate
  2. Ambil localDate dengan menggunakan metode "of" yang mengambil 3 argumen dalam format "int".
  3. akhirnya, dapatkan nama hari itu menggunakan metode "getDayOfWeek".

Ada satu video tentang tantangan ini.

Solusi Java Date and Time Hackerrank

Saya harap ini akan membantu :)

Ravi Solanki
sumber
Jika ada yang datang ke sini untuk HackerRank Java Tanggal dan Waktu dan ingin menggunakan CalendarKelas itu, Harap dicatat bahwa setmetode dalam Kalender memakan waktu berbulan-bulan mulai dari 0. yaitu 0 for January,. Terima kasih!
Sagar Devkota
2

Menambahkan cara lain untuk melakukannya persis seperti yang diminta OP, tanpa menggunakan metode inbuilt terbaru:

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;
}
Spriha
sumber
1
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Alex Riabov
1
Ini adalah lebih dari satu cara cara berkecil hati untuk melakukannya. Kode Anda tidak dapat dikompilasi. Anda tidak harus menggunakan kelas yang sudah usang dan dirancang dengan buruk SimpleDateFormatdan Date. Khususnya Anda tidak boleh menggunakan getDaymetode yang sudah usang , itu tidak dapat diandalkan. Dan Anda tidak boleh menggunakan if- elseuntuk memilih di antara 7 nilai, ini untuk apa kami miliki switch, atau Anda dapat menggunakan array. Secara keseluruhan, kode Anda lebih panjang dan lebih rumit dari yang seharusnya.
Ole VV
1
Dan gunakan singkatan built-in month daripada memasok sendiri. Lebih sederhana dan lebih rentan kesalahan.
Ole VV
1
Kelas bermasalah yang digunakan di sini digantikan bertahun-tahun yang lalu oleh kelas java.time . Menyarankan penggunaannya pada 2018 adalah saran yang buruk.
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;
    }
}
Sandeep. N
sumber
2

Program untuk menemukan hari dalam seminggu dengan memberikan tanggal dan tahun input input pengguna menggunakan java.util.scannerpaket:

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));
    }
}
Tidak ada
sumber
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
Basil Bourque
@ Apakah ini benar-benar baik untuk dibaca? 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);

Dapatkan nilai hari dengan memberikan cap waktu saat ini.

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

}
Abhishek
sumber
2
Akan bermanfaat untuk menambahkan beberapa penjelasan tentang jawaban untuk memuji kode.
ritlew
1

metode di bawah ini mengambil tujuh hari dan kembali nama pendek hari dalam Daftar Array di Kotlin, Anda hanya dapat memformat ulang kemudian dalam format Java, hanya menyajikan ide bagaimana Kalender dapat mengembalikan nama pendek

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

out put hasil seperti

I/System.out: Wed
    Tue
    Mon
    Sun
I/System.out: Sat
    Fri
    Thu
masokaya
sumber
1
Jika OP bertanya tentang Java, maka yang terbaik adalah merespons dengan Java.
mypetlion
1
Tidak ada alasan mengapa kita ingin menggunakan Calendarkelas pada tahun 2019. Ini dirancang dengan buruk dan sudah usang. Alih-alih, saya merekomendasikan LocalDatedan DayOfWeekdari java.time, API tanggal dan waktu Java modern .
Ole VV
0

Anda dapat menggunakan metode di bawah ini untuk mendapatkan Day of the Week dengan melewati tanggal tertentu,

Di sini untuk metode kumpulan kelas Kalender, bagian Tricky adalah indeks untuk parameter bulan akan dimulai dari 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;
    }
Hardik Patel
sumber
3
Jawaban ini keliru, menggunakan kelas tanggal waktu lama yang mengerikan yang sekarang merupakan warisan, digantikan oleh kelas java.time. Selain itu, kode ini mengabaikan masalah krusial zona waktu setelah menerapkan kelas tanggal-waktu dengan canggung untuk masalah khusus tanggal. Sebagai gantinya, lihat Jawaban yang benar untuk java.time oleh Przemek .
Basil Bourque
0

Kelas kalender memiliki fungsionalitas displayName bawaan:

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

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

Tersedia sejak Java 1.6. Lihat juga dokumentasi Oracle

Leo Ufimtsev
sumber
0

Ini berfungsi dengan benar ...

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

Ini memberikan metode inbuilt getDayOfWeek () untuk mendapatkan hari dalam minggu tertentu:

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

Untuk menetapkan nilai enum l.getDayOfWeek()ke string, Anda mungkin bisa menggunakan metode Enum yang disebut name()yang mengembalikan nilai objek enum.

Ganesh Chowdhary Sadanala
sumber
2
Jawaban tentang Stack Overflow lebih baik jika mereka menyertakan beberapa penjelasan dan juga potongan kode.
Basil Bourque
@ David, saya telah mencari perbedaan dalam hasil edit saya dan milik Anda, saya tidak dapat menemukannya. Akan menyenangkan untuk mendapatkan info cara mengedit.
Pochmurnik
@OrdinaryDraft Anda menambahkan listHolidays.add(LocalDate.of(year, 1, 1));jawaban. Jika Anda ingin meningkatkan jawabannya, Anda harus menambahkan jawaban Anda sendiri. Semoga itu bisa membantu
David
Ya, saya kemudian memeriksa hasil edit saya untuk dibandingkan dengan versi Anda. Sepertinya saya menyalin kalimat itu tanpa sengaja.
Pochmurnik
-3

Di bawah ini adalah dua baris cuplikan menggunakan Java 1.8 Time API untuk Kebutuhan Anda.

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());
Hardik Patel
sumber
2
Pendekatan yang ditunjukkan di sini telah dibahas setidaknya dalam 4 Jawaban yang baik yang diposting lama. Saya tidak melihat nilai tambah dari duplikat ini.
Basil Bourque