poner - spinner fecha java




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

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 se desea el ordinal del día, ¿cómo se puede recuperar?


java.time

Usando el marco java.time integrado en Java 8 y posterior.

La enum DayOfWeek puede generar una cadena del nombre del día automáticamente localizada en el lenguaje humano y las normas culturales de una Locale . Especifique un TextStyle para indicar que desea una forma larga o un nombre abreviado.

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.time.format.TextStyle
import java.util.Locale

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

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 ejecutado en vivo en IdeOne.com (pero solo Locale.US funciona allí).

java.time

Ver mi código de ejemplo anterior, y ver la respuesta correcta para java.time por Przemek .

Número ordinal

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

Para el número ordinal, considere pasar el objeto enum DayOfWeek lugar, como DayOfWeek.TUESDAY . Tenga en cuenta que un DayOfWeek es un objeto inteligente, no solo una cadena o un simple número entero. El uso de esos objetos enum hace que su código sea más autodocumentado, garantiza valores válidos y proporciona type-safety .

Pero si insiste, pregúntele a DayOfWeek por un 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 marco de java.time está integrado en Java 8 (así como también está respaldado por Java 6 y 7 y se ha adaptado aún más a Android ).

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

LocalDate

Joda-Time ofrece la clase LocalDate para representar una fecha solamente sin hora o zona horaria. Justo lo que esta pregunta requiere. Las antiguas clases de 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 se ejecuta.

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

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy 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 para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Consulte Cómo utilizar ThreeTenABP ....

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y more .


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

Programa para encontrar el día de la semana dando la fecha de entrada del usuario mes y año utilizando el paquete java.util.scanner.

import java.util.Scanner;

public class Calender{
  public static String getDay(String day, String month, String year) {

    int ym, yp, d, ay, a=0;
    int by = 20;
    int y[]=new int []{6,4,2,0};
    int m[]=new int []{0,3,3,6,1,4,6,2,5,0,3,5};

    String wd[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

    int gd=Integer.parseInt(day);
    int gm=Integer.parseInt(month);
    int gy=Integer.parseInt(year);

    ym=gy%100;
    yp=ym/4;
    ay=gy/100;

    while (ay!=by) {
        by=by+1;
        a=a+1;
        if(a==4) {
            a=0;
        }
    }

    if ((ym%4==0) && (gm==2)){
        d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
    }
    else
    d = (gd+m[gm-1]+ym+yp+y[a])%7;
    return wd[d];
}

 public static void main(String[] args){

     Scanner in = new Scanner(System.in);

     String day = in.next();
     String month = in.next();
     String year = in.next();

    System.out.println(getDay(day, month, year));
 }
}

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

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

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

Sí. Dependiendo de tu 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 Tue lugar de 3 (los días de la semana se indexan comenzando en 1), en lugar de pasar por un calendario, simplemente vuelva a formatear la cadena: new SimpleDateFormat("EE").format(date) ( EE significa " día de la semana, versión corta ")

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

  • puede usar DateTime joda-time y llamar a dateTime.dayOfWeek() y / o DateTimeFormat .


Simplemente use los stufs SimpleDateFormat :)

SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date MyDate = newDateFormat.parse("28/12/2013");
newDateFormat.applyPattern("EEEE d MMM yyyy")
String MyDate = newDateFormat.format(MyDate);

El resultado es: sábado 28 de diciembre de 2013 .

Si quieres diferentes posiciones, simplemente reemplázalo en el método applyPattern.

Pero si solo desea el día de la semana, déjelo así:

newDateFormat.applyPattern("EEEE")

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

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


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

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.

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

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






date