¿Cómo determinar el día de la semana pasando una fecha específica?

188

Por ejemplo, tengo la fecha: "23/2/2010" (23 de febrero de 2010). Quiero pasarlo a una función que devolvería el día de la semana . ¿Cómo puedo hacer esto?

En este ejemplo, la función debería devolver String"Tue".

Además, si solo se desea el día ordinal, ¿cómo se puede recuperar?

evilReiko
fuente

Respuestas:

350

Si. Dependiendo de su caso exacto:

  • Puedes usar java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • si necesita que la salida sea en Tuelugar de 3 (los días de la semana están indexados comenzando en 1 para el domingo, vea Calendar.SUNDAY), en lugar de pasar por un calendario, simplemente vuelva a formatear la cadena: new SimpleDateFormat("EE").format(date)(que EEsignifica "día de la semana, versión corta" )

  • si tiene su entrada como cadena, en lugar de Date, debe usar SimpleDateFormatpara analizarla:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • puedes usar joda-time's DateTimey call dateTime.dayOfWeek()y / o DateTimeFormat.

  • editar: desde Java 8 ahora puede usar el paquete java.time en lugar de joda-time

Bozho
fuente
20
Los días de la semana comienzan desde el 1, que es el domingo, así que creo que el martes sería 3.
Mohammad Banisaeid
13
En otras cosas a tener en cuenta, si configura la fecha en el objeto Calendario usando enteros (no mediante el análisis de una cadena), tenga en cuenta que el número del mes está basado en cero, por lo que enero es 0 y diciembre es 11.
RenniePet
44
@ RenniePet: Buena. También puede usar constantes en Calendarclase, como Calendar.SUNDAYo Calendar.JANUARY.
Mohammad Banisaeid
2
Esta respuesta fue una gran respuesta cuando fue escrita. Hoy querrás las clases ahora desactualizadas Calendar, Datey DateTimeFormat(y el tiempo de Joda también) y usar las java.timeclases de Java 8 , por ejemplo YearMontho LocalDate. Ver más en esta respuesta .
Ole VV
44
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de 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);

Use este código para encontrar el nombre del día desde una fecha de entrada. Simple y bien probado.

JDGuide
fuente
1
Si utiliza este método, tome nota cuidadosamente del orden de días y meses.
Joel Christophel
1
Creo que necesitas ponerlo en un bloque de
prueba
1
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle .
Basil Bourque
Android solo implementa LocalDate después de API 26.
Jacob Sánchez
29

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

El resultado es: sáb, 28 dic 2013

El constructor predeterminado está tomando la configuración regional "predeterminada" , así que tenga cuidado al usarla cuando necesite un patrón específico.

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

tl; dr

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

mar

Vea este código en vivo en IdeOne.com (pero solo Locale.USfunciona allí).

java.time

Vea mi código de ejemplo anterior y vea la respuesta correcta para java.time de Przemek .

Número ordinal

si solo se desea el día ordinal, ¿cómo se puede recuperar?

Para el número ordinal, considere la posibilidad de pasar alrededor del DayOfWeekobjeto enumeración lugar como DayOfWeek.TUESDAY. Tenga en cuenta que a DayOfWeekes un objeto inteligente, no solo una cadena o un mero número entero. El uso de esos objetos de enumeración hace que su código sea más autodocumentado, garantiza valores válidos y proporciona seguridad de escritura .

Pero si insiste, solicite DayOfWeekun número . Obtiene 1-7 de lunes a domingo según el estándar ISO 8601 .

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

Joda-Time

ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento. El equipo aconseja migrar a las clases java.time. El framework java.time está integrado en Java 8 (así como portado a Java 6 y 7 y adaptado a Android ).

Aquí hay un código de ejemplo que usa la versión 2.4 de la biblioteca Joda-Time , como se menciona en la respuesta aceptada por Bozho . Joda-Time es muy superior a las clases java.util.Date/.Calendar incluidas en Java.

LocalDate

Joda-Time ofrece la LocalDateclase para representar una fecha solamente sin ninguna hora del día o zona horaria. Justo lo que esta pregunta requiere. Las antiguas clases java.util.Date/.Calendar incluidas con Java carecen de este concepto.

Analizar gramaticalmente

Analiza la cadena en un valor de fecha.

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

Extraer

Extraiga del valor de la fecha el número y el nombre del día de la semana.

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

Tugurio

Volcado a la consola.

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

correr

Cuando corre

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

Sobre java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente
15

java.time

Usando el java.timeframework integrado en Java 8 y posterior.

La enumeración puede generar una Cadena del nombre del día localizada automáticamente en el lenguaje humano y las normas culturales de a . Especifique a para indicar que desea una forma larga o un nombre abreviado.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
fuente
1
Esto solo se puede usar en Oreo y apis superiores.
codepeaker
2
@codepeaker La mayor parte de la funcionalidad java.time se transfiere a Java 6 y Java 7 en el proyecto ThreeTen-Backport . Más adaptado para Android anterior (<26) en ThreeTenABP . Ver Cómo utilizar ThreeTenABP ... .
Basil Bourque
9

Puedes probar el siguiente código:

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
fuente
¿Cómo agrega valor esta respuesta más allá del uso de las dos o tres respuestas anteriores LocalDate? ¿Lo leíste antes de publicar?
Basil Bourque
1
Esta es una buena respuesta, y ES diferente de todas las anteriores. Utiliza la API LocalDate.of () para construir la fecha, y es mucho más corta que la mayoría de las otras respuestas (a veces la respuesta corta es mejor que la larga) ...
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
fuente
buena solución, estaba encontrando exactamente este tipo de solución, mi línea requerida que resolvió mi problema. String dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam
9

Para Java 8 o posterior , es preferible 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();
}

Nota: si la entrada está definida por String / User, debe analizarla en int .

MST
fuente
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
fuente
5

Otra forma "divertida" es usar el algoritmo Doomsday . Es un método mucho más largo, pero también es más rápido si no necesita crear un objeto Calendario con una fecha determinada.

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
fuente
5

Puede usar el siguiente fragmento de código para entradas como (día = "08", mes = "05", año = "2015" y la salida será "MIÉRCOLES")

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
fuente
1
Esta respuesta no es aconsejable, ya que utiliza la problemática fecha-hora antigua que ahora es heredada, suplantada por las modernas clases java.time.
Basil Bourque
1
Esta es la pregunta que se hace en Hackerrank.
Prathamesh Más
5

Respuesta de una línea:

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

Ejemplo de uso:

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
fuente
Funcionó, solo necesitaba reemplazar .name () con 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
fuente
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
fuente
@Ayarnush ¿Cómo agrega su Respuesta algún valor más allá de la Respuesta de Przemek publicada el mes pasado?
Basil Bourque
2

Hay un desafío en hackerrank Java Date and Time

personalmente, prefiero la clase LocalDate.

  1. Importar java.time.LocalDate
  2. Recupere localDate usando el método "of" que toma 3 argumentos en formato "int".
  3. finalmente, obtenga el nombre de ese día usando el método "getDayOfWeek".

Hay un video sobre este desafío.

Solución Java Hackerrank de fecha y hora

Espero que ayude :)

Ravi Solanki
fuente
Si cualquier otro viniendo aquí por HackerRank Java fecha y la hora y quieren usar esa Calendarclase, por favor nota que el setmétodo en el Calendario lleva meses a partir de 0. es decir, 0 for January. ¡Gracias!
Sagar Devkota
2

Agregando otra forma de hacerlo exactamente lo que solicitó el OP, sin usar los últimos métodos incorporados:

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
fuente
1
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Alex Riabov
1
Esta es, en más de una forma, la forma desalentada de hacerlo. Su código no puede ser compilado. No deberías usar las clases SimpleDateFormaty desactualizadas y mal diseñadas Date. En particular, no debe usar el getDaymétodo obsoleto , no es confiable. Y no debe usar if: elsepara seleccionar entre 7 valores, esto es para lo que tenemos switch, o puede usar una matriz. En general, su código es más largo y más complicado de lo necesario.
Ole VV
1
Y use las abreviaturas de mes integradas en lugar de proporcionar las suyas propias. Más simple y menos propenso a errores.
Ole VV
1
Las clases problemáticas utilizadas aquí fueron suplantadas hace años por las clases java.time . Sugerir su uso en 2018 es un mal consejo.
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
fuente
2

Programa para encontrar el día de la semana dando la fecha de entrada del usuario mes y año usando el java.util.scannerpaquete:

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));
    }
}
Ninguno
fuente
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle .
Basil Bourque
@Dave, ¿es realmente agradable de leer? 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);

Obtenga el valor del día proporcionando la marca de tiempo actual.

Amit
fuente
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
fuente
2
Sería útil agregar alguna explicación de la respuesta para complementar el código.
ritlew
1

Sin embargo, el método a continuación recupera siete días y devuelve el nombre corto de días en List Array en Kotlin, puede volver a formatear y luego en formato Java, simplemente presentando la idea de cómo Calendar puede devolver el nombre corto

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

poner resultados como

I/System.out: Wed
    Tue
    Mon
    Sun
I/System.out: Sat
    Fri
    Thu
masokaya
fuente
1
Si OP pregunta sobre Java, entonces sería mejor responder con Java.
mypetlion
1
No hay ninguna razón por la que debamos querer usar la Calendarclase en 2019. Está mal diseñada y está desactualizada. En cambio, recomiendo LocalDatey DayOfWeekde java.time, la API moderna de fecha y hora de Java .
Ole VV
0

Puede usar el siguiente método para obtener el Día de la semana pasando una fecha específica,

Aquí, para el método establecido de la clase Calendario, la parte difícil es que el índice del parámetro del mes comenzará desde 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
fuente
3
Esta respuesta no es aconsejable, ya que utiliza clases terribles de fecha y hora que ahora son heredadas, suplantadas por las clases java.time. Además, este código ignora la cuestión crucial de la zona horaria después de aplicar torpemente una clase de fecha y hora a un problema de solo fecha. En cambio, vea la respuesta correcta para java.time por Przemek .
Basil Bourque
0

La clase de calendario tiene una funcionalidad incorporada de displayName:

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

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

Disponible desde Java 1.6. Consulte también la documentación de Oracle

Leo Ufimtsev
fuente
0

Esto funciona correctamente ...

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

Proporciona el método incorporado getDayOfWeek () para obtener el día de una semana en particular:

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

Para asignar el valor de enum l.getDayOfWeek()a una cadena, probablemente podría usar el método de Enum llamado name()que devuelve el valor del objeto enum.

Ganesh Chowdhary Sadanala
fuente
2
Las respuestas sobre Stack Overflow son mejores si incluyen alguna explicación, así como un fragmento de código.
Basil Bourque
@David, he estado buscando diferencias en mi edición y la tuya, no puedo encontrarla. Sería bueno obtener la información sobre cómo editar.
Pochmurnik
@OrdinaryDraft agregó un listHolidays.add(LocalDate.of(year, 1, 1));a la respuesta. Si desea mejorar la respuesta, debe agregar la suya. Espero que ayude
David
Sí, luego revisé mi edición para compararla con su versión. Parece que copié esa línea por error.
Pochmurnik
-3

A continuación se muestran las dos líneas de fragmentos que utilizan la API Java 1.8 Time para su Requisito.

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());
Hardik Patel
fuente
2
El enfoque que se muestra aquí ya se ha cubierto en al menos 4 buenas respuestas publicadas hace mucho tiempo. No veo ningún valor agregado por este duplicado.
Basil Bourque