How to determine day of week by passing specific date?

前端 未结 25 1469
夕颜
夕颜 2020-11-22 05:12

For Example I have the date: \"23/2/2010\" (23th Feb 2010). I want to pass it to a function which would return the day of week. How can I do this?

I

25条回答
  •  广开言路
    2020-11-22 05:44

    Another "fun" way is to use Doomsday algorithm. It's a way longer method but it's also faster if you don't need to create a Calendar object with a given date.

    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> anchorDaysMap = new HashMap<>();
        public static HashMap 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() {
                {
                    add(Integer.valueOf(1700));
                    add(Integer.valueOf(2100));
                    add(Integer.valueOf(2500));
                }
            });
    
            anchorDaysMap.put(Integer.valueOf(2), new ArrayList() {
                {
                    add(Integer.valueOf(1600));
                    add(Integer.valueOf(2000));
                    add(Integer.valueOf(2400));
                }
            });
    
            anchorDaysMap.put(Integer.valueOf(3), new ArrayList() {
                {
                    add(Integer.valueOf(1500));
                    add(Integer.valueOf(1900));
                    add(Integer.valueOf(2300));
                }
            });
    
            anchorDaysMap.put(Integer.valueOf(5), new ArrayList() {
                {
                    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> entry : anchorDaysMap.entrySet()) {
                if (entry.getValue().contains(Integer.valueOf(century))) {
                    return entry.getKey();
                }
            }
            return 0;
        }
    }
    

提交回复
热议问题