Как определить день недели, пройдя конкретную дату?



например у меня есть дата: "23/2/2010" (23 февраля 2010). Я хочу передать его в функцию, которая будет возвращать день недели. Как я могу это сделать?



в этом примере функция должна возвращать String "Вт".



кроме того, если требуется только порядковый номер дня, как это можно получить?

524   22  

22 ответов:

да. В зависимости от вашего конкретного случая:

  • можно использовать java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    
  • если вам нужно, чтобы выход был Tue вместо 3 (дни недели индексируются, начиная с 1), вместо того, чтобы проходить через календарь, просто переформатируйте строку:new SimpleDateFormat("EE").format(date) (EE что означает "день недели, короткая версия")

  • если у вас есть свой ввод как строку, а не Date, вы должны использовать SimpleDateFormat чтобы разобрать его: new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • вы можете использовать Джода-время DateTime и звонок dateTime.dayOfWeek() и/или DateTimeFormat.

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

используйте этот код для поиска названия дня из входной даты.Простой и хорошо протестирован.

просто использовать 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);

результат: СБ, 28 Декабря 2013

конструктор по умолчанию принимает "по умолчанию" Locale, поэтому будьте осторожны, используя его, когда вам нужен определенный шаблон.

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

tl; dr

используя java.время...

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

Вт

посмотреть этот code run live at IdeOne.com (но только Locale.US работает там).

java.время

смотрите мой пример кода выше, и смотрите правильный ответ для java.время Пшемек.

порядковый номер

если требуется только порядковый номер дня, как это может быть восстановили?

для порядкового номера, рассмотреть возможность передачи Вокруг DayOfWeek перечислить объект вместо таких как DayOfWeek.TUESDAY. Имейте в виду, что DayOfWeek это умный объект, а не просто строка или просто целое число. С помощью этих объектов enum делает ваш код более самодокументированным, обеспечивает допустимые значения и обеспечивает тип-безопасность.

но если ты настаиваешь, задать DayOfWeek за номером. Вы получить 1-7 за понедельник-воскресенье за ISO 8601 стандартные.

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

Joda Времени

обновление: проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на java.время занятий. Ява.временные рамки встроены в Java 8 (а также back-ported to Java 6 & 7 и дополнительно адаптирована к Android).

вот пример кода с использованием Joda Времени библиотеки версии 2.4, как говорится в принят ответ Божо. Joda-Time намного превосходит java.утиль.Дата./Классы календаря в комплекте с Java.

LocalDate

Joda времени предлагает LocalDate класс для представления только даты без какого-либо времени суток или часового пояса. Только то, что этот вопрос требует. Старая Ява.утиль.Дата./Классы календаря в комплекте с Java не имеют этой концепции.

парсить

парсить строки в значение даты.

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

экстракт

извлечь из значения даты номер и название дня недели.

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

свалка

дамп в консоли.

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

выполнить

при запуске.

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

о java.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date,Calendar,& SimpleDateFormat.

The Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.

где получить java.время занятий?

  • Java SE 8,Java SE 9, и позже
    • встроенный.
    • часть стандартного Java API с комплектной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android

The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как Interval,YearWeek,YearQuarter и больше.

java.время

используя java.time фреймворк, встроенный в Java 8 и более поздние версии.

The DayOfWeekперечисление может генерировать строку названия дня, автоматически локализованную на человеческий язык и культурные нормы a Locale. Указать TextStyle чтобы указать, что вы хотите длинную форму или сокращенное наименование.

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

еще один "забавный" способ-использовать алгоритм Судного дня. Это более длинный метод, но он также быстрее, если вам не нужно создавать объект календаря с заданной датой.

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

вы можете попробовать следующий код:

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

одна строка ответа:

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

Пример Использования:

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

можно использовать следующий фрагмент кода для ввода типа (День = "08", месяц = "05", год = " 2015 "и выход будет"среда")

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

добавление другого способа сделать это именно то, что просил OP, без использования последних встроенных методов:

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;
}
Calendar cal = Calendar.getInstance(desired date);
cal.setTimeInMillis(System.currentTimeMillis());
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

получить значение Дня, указав текущую отметку времени.

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.

вы можете использовать ниже метод, чтобы получить День недели, передав определенную дату,

здесь для метода set класса Calendar, Tricky part-это индекс для параметра месяца, который начинается с 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;
    }

программа для поиска дня недели, предоставляя пользователю ввод даты месяца и года с помощью java.утиль.пакет сканера.

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

класс Calendar имеет встроенную функциональность displayName:

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

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

доступно с Java 1.6. Смотрите также документация Oracle

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

}

есть проблема на hackerrank дата и время Java

лично я предпочитаю класс LocalDate.

  1. импорт java.время.LocalDate
  2. получить localDate с помощью метода" of", который принимает 3 аргумента в формат "инт".
  3. наконец, получить имя этого дня с помощью метода" getDayOfWeek".

есть одно видео на эту проблему.

Java дата и время Hackerrank решение

надеюсь, это поможет:)

Ниже приведены две строки фрагмента с использованием Java 1.8 Time API для вашего требования.

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

Comments

    Ничего не найдено.