Рассчитать следующую и третью рабочую дату от данной даты

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

Но помните, что это относится к случаю String. Если вы хотите сравнить регистр без учета регистра, вы должны пойти для метода equalsIgnoreCase класса String.

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

1
задан Yunnosch 10 March 2019 в 21:19
поделиться

1 ответ

Я использую несколько функций из библиотеки «datetime». Вы можете весело написать их: date (y, m, d), timedelta (days = 7), day, weekday (), '{:% Y% m% d}'. Format (day), strptime (input , "% Y% m% d"), strftime (datetime, "% a% x"). Хорошая идея - создать класс для даты и избавиться от всех преобразований формата. Таким образом, только дата (y, m, d), timedelta (days = 7), day, weekday () будут оставлены для тренировки.

import datetime
from datetime import date, timedelta


def day2string(day):
    return '{:%Y%m%d}'.format(day)


def year_holidays(year):
    holidays = [
        ["New Year's Day", 1, 1],  # Fixed: January 1
        ["Birthday of Martin Luther King, Jr.", 1, 0, 0, 3],  # Floating
        ["Washington's Birthday", 2, 0, 0, 3],  # Third Monday in February
        ["Memorial Day", 5, 0, 0, 5],  # Last Monday
        ["Independence Day", 7, 4],
        ["Labor Day", 9, 0, 0, 1],
        ["Columbus Day", 10, 0, 0, 2],
        ["Veterans Day", 11, 11],
        ["Thanksgiving Day", 11, 0, 3, 4],
        ["Christmas Day", 12, 25]
    ]
    year_list = []
    for h in holidays:
        if h[2] > 0:
            day = date(year, h[1], h[2])  # Fixed day
        else:
            day = date(year, h[1], 1)  # Floating day
            while h[3] != day.weekday():  # Advance to match the weekday
                day += timedelta(days=1)
            count = 1
            while count != h[4]:  # Match the repetition of this day
                next_week = day + timedelta(days=7)
                if next_week.month == day.month:
                    day = next_week
                count += 1
        year_list.append(day2string(day))
    return year_list  # return the holidays as list of strings


def str2datetime(string):
    return datetime.datetime.strptime(string, '%Y%m%d')


def next_working_day(string):
    day = str2datetime(string)
    day += timedelta(days=1)
    while True:
        while day.weekday() >= 5:
            day += timedelta(days=1)
        holidays_list = year_holidays(day.year)
        for str_day in holidays_list:
            s2 = day2string(day)
            if str_day == s2:
                day += timedelta(days=1)
                break  # for
        if day.weekday() < 5:
            break  # while True
    return day2string(day)


if __name__ == '__main__':
    dates = [
        ['20190308', '20190311', '20190313'],
        ['20190309', '20190311', '20190313'],
        ['20190310', '20190311', '20190313'],
        ['20190311', '20190312', '20190314'],
        ['20190329', '20190401', '20190403'],
        ['20181231', '20190102', '20190104'],
        ['20190118', '20190122', '20190124'],
        ['20190216', '20190219', '20190221'],
        ['20190526', '20190528', '20190530'],
        ['20190703', '20190705', '20190709'],
        ['20190828', '20190829', '20190903'],
        ['20191010', '20191011', '20191016'],
        ['20191108', '20191112', '20191114'],
        ['20191125', '20191126', '20191129'],
        ['20191224', '20191226', '20191230'],
        ['20191227', '20191230', '20200102']]
    print('\n              Today        Next   and   3rd business day')
    for days in dates:
        next_day = next_working_day(days[0])
        third_day = next_working_day(next_working_day(next_day))
        if next_day != days[1] or third_day != days[2]:
            print('*** ERROR *** ', end='')
        else:
            print('              ', end='')

        def f(x): return datetime.datetime.strftime(str2datetime(x), '%a %x')

        print(f(days[0]), f(next_day), f(third_day))

Это должно создать следующий вывод:

          Today        Next   and   3rd business day
          Fri 03/08/19 Mon 03/11/19 Wed 03/13/19
          Sat 03/09/19 Mon 03/11/19 Wed 03/13/19
          Sun 03/10/19 Mon 03/11/19 Wed 03/13/19
          Mon 03/11/19 Tue 03/12/19 Thu 03/14/19
          Fri 03/29/19 Mon 04/01/19 Wed 04/03/19
          Mon 12/31/18 Wed 01/02/19 Fri 01/04/19
          Fri 01/18/19 Tue 01/22/19 Thu 01/24/19
          Sat 02/16/19 Tue 02/19/19 Thu 02/21/19
          Sun 05/26/19 Tue 05/28/19 Thu 05/30/19
          Wed 07/03/19 Fri 07/05/19 Tue 07/09/19
          Wed 08/28/19 Thu 08/29/19 Tue 09/03/19
          Thu 10/10/19 Fri 10/11/19 Wed 10/16/19
          Fri 11/08/19 Tue 11/12/19 Thu 11/14/19
          Mon 11/25/19 Tue 11/26/19 Fri 11/29/19
          Tue 12/24/19 Thu 12/26/19 Mon 12/30/19
          Fri 12/27/19 Mon 12/30/19 Thu 01/02/20
0
ответ дан Alexander Lopatin 10 March 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: