Как изменить приведенный ниже код, чтобы недельный диапазон был с четверга, 12:00 по центральному часовому поясу, до следующего четверга, 12:00, чтобы установить начальную дату недели на четверг и конечную неделю на четверг вместо воскресенья по воскресенье?

    Date startWeek = Date.Today().toStartofWeek();
    System.debug(startWeek);
    Date endWeek = Date.Today().toStartofWeek()+6;     
    System.debug(endWeek);
    DateTime dt = DateTime.newInstance(System.today(),Time.newInstance(18,0,0,0));
    String dayOfWeek = dt.format('u');


    //How many days from current week's Thursday is the date?
    Integer offset = Integer.valueOf(dayOfWeek) - 4;
    //If it's before the current weeks' Thursday
    if(offset < 0){
    //Last Thursday should be start date - if you're 3 days away from the current Thursday, you're 4 days away from last thursday (7 days in a week)
    startWeek = Date.Today() - (offset + 7); 
    endWeek = Date.Today() + math.abs(offset);
    } else if (offset > 0) {
    //If it's past current Thursday, apply the opposite logic of the other condition
    startWeek = Date.Today() - offset;
    endWeek = Date.Today() + (7 - offset);
    } else {
    //last condition is that today is Thursday
    startWeek = Date.Today();
    endWeek = Date.Today() + 7;
    }
0
Julian 6 Фев 2020 в 20:17

1 ответ

Лучший ответ

Вам нужно будет выполнить некоторую пользовательскую логику в качестве класса Date документация показывает, что вернет toStartofWeek в зависимости от языкового стандарта пользователя.

enter image description here

Поскольку вы всегда хотите использовать четверг, вам нужно выяснить, какой день недели является текущим днем.

DateTime dt = DateTime.newInstance(System.today(),Time.newInstance(0,0,0,0));
String dayOfWeek = dt.format('u');

Это вернет:

1 = понедельник

2 = вторник

3 = среда

4 = четверг

5 = пятница

6 = суббота

7 = воскресенье

Из этого вы теперь знаете, что можно добавить или вычесть для начала и конца. Вы можете использовать время, понимая, что оно находится по Гринвичу (если вы хотите 12 часов дня, используйте время по Гринвичу того, что составляет 6 часов вечера). Ниже я также использую «13», так как я выполнял код сам и тестировал в EST. Возможно, вам придется это учитывать в зависимости от того, где выполняется этот код. Я оставил операторы System.debug(), поскольку они показывают, как может быть полезно ориентироваться в том, как хранится время.

//setting variables for logic
DateTime startWeek;
DateTime endWeek;
//set this to your desired time
DateTime dt = DateTime.newInstance(System.today(),Time.newInstance(13,0,0,0));
DateTime curr = DateTime.now();
String dayOfWeek = dt.format('u');
Time cutOffTime = Time.newInstance(18,0,0,0);

//How many days from current week's Thursday is the date?
Integer offset = Integer.valueOf(dayOfWeek) - 4;
offset = 1;

System.debug('offset ' + offset + ' and curr ' + curr + ' and dt ' + dt);
//If it's before the current weeks' Thursday
if(offset < 0){
    //Last Thursday should be start date - if you're 3 days away from the current Thursday, you're 4 days away from last thursday (7 days in a week)
    startWeek = dt - (offset + 7); 
    endWeek = dt + math.abs(offset);
} else if (offset > 0) {
    //If it's past current Thursday, apply the opposite logic of the other condition
    startWeek = dt - offset;
    endWeek = dt + (7 - offset);
} else if (offset == 0 && curr.hour() < 18)  {
    //Before the cutoff of the current Thursday
    startWeek = dt.addDays(-7);
    endWeek = dt;
} else {
    //last condition is that today is Thursday and it's past the alloted time
    startWeek = dt;
    endWeek = dt.addDays(-7);
}

System.debug('start date ' + startWeek + ' and end date ' + endWeek);

Важное примечание: выше предполагается, что вы используете четверг. Лучшим подходом было бы сохранить номер дня недели (в данном случае 4) в пользовательской настройке или пользовательском типе метаданных. Это позволяет вам быстро изменить его без каких-либо изменений кода, если вы измените день недели, в который хотите начать или закончить.

0
Kris Goncalves 6 Фев 2020 в 21:09
Это очень полезно спасибо! У меня есть еще один вопрос, и это может слишком усложнить код, но что, если я хочу также установить время начала. Я знаю, что мне также придется включить логику DateTime, но скажем, я хочу объявить начало недели в четверг в 11:00 CDT до следующего четверга в 11:00 CDT.
 – 
Julian
4 Фев 2020 в 00:22
Когда вы создаете DateTime в DateTime dt = DateTime.newInstance(System.today(),Time.newInstance(0,0,0,0));, вы можете установить время. В моем примере я поставил (0,0,0,0), но вы можете указать любое время (часы, минуты, секунды, миллисекунды).
 – 
Kris Goncalves
4 Фев 2020 в 18:00
Поэтому я попробовал код сегодня (в четверг до 12 часов), и он не сработал. Пожалуйста, смотрите мой отредактированный код в исходном вопросе выше. Я исследовал Time.newInstace() и увидел, что это часовой пояс UTC, поэтому я устал с (12,0,0,0) и (18,0,0,0), поскольку 12:00 по центральному времени - 18:00 UTC. Любой совет?
 – 
Julian
6 Фев 2020 в 20:15
Мне придется взглянуть на это еще раз, поскольку я действительно не делал код с временным компонентом в уме. Сейчас логика основана на днях недели, поэтому она не учитывает 10 в четверг против 12 в четверг.
 – 
Kris Goncalves
6 Фев 2020 в 20:27
Я обновил его. Однако я не уверен, что это будет на 100% без учета часового пояса текущего пользователя (кто бы ни выполнял код) в зависимости от того, как это отображается или делается. Если он работает в системном режиме (например, триггер), вам нужно изменить значение времени dt на 18 вместо 13.
 – 
Kris Goncalves
6 Фев 2020 в 20:55