Respuestas:
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
Calendarclase, como Calendar.SUNDAYo Calendar.JANUARY.
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 .
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 .
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.
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 .
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));
}
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í).
Vea mi código de ejemplo anterior y vea la respuesta correcta para java.time de Przemek .
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() ;
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.
LocalDateJoda-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.
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 );
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 );
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 );
Cuando corre
input: 23/2/2010
localDate: 2010-02-23
dayOfWeek: 2
output: Tue
outputQuébécois: mar.
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 .
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
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));
}
}
LocalDate? ¿Lo leíste antes de publicar?
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);
}
}
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 .
...
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());
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;
}
}
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();
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
}
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;
}
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.
Hay un desafío en hackerrank Java Date and Time
personalmente, prefiero la clase LocalDate.
Hay un video sobre este desafío.
Solución Java Hackerrank de fecha y hora
Espero que ayude :)
Calendarclase, por favor nota que el setmétodo en el Calendario lleva meses a partir de 0. es decir, 0 for January. ¡Gracias!
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;
}
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.
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;
}
}
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));
}
}
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 .
if ((ym%4==0) && (gm==2)){ d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
//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);
}
}
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
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 .
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;
}
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
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.
listHolidays.add(LocalDate.of(year, 1, 1));a la respuesta. Si desea mejorar la respuesta, debe agregar la suya. Espero que ayude
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());