Как рассчитать дату окончания - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь вычислить endDate с учетом startDate и продолжительности.

Пример:

func calculateEndDate(startDate *time.Time, duration uint32, durationType uint32) *time.Time {
    endDate := &time.Time{}
    switch enum.DurationType(durationType) {
    case enum.DayType:
        temp := startDate.Add(time.Duration(24*duration) * time.Hour)
        endDate = &temp
    }
    return endDate
}

Это идиоматический c способ сделать это? И следует ли мне следовать этой схеме, если я хочу использовать разные типы времени, такие как years или months?

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Простейшим будет просто использовать time.Duration и метод time.Add() для расчета даты окончания:

t := time.Now()
d := 3*time.Hour + 20*time.Minute

end := t.Add(d)

Если дата может быть больше чем в день, то этого уже недостаточно, поскольку необходимо учитывать летнее время и високосные годы. Кроме того, time.Duration не может представлять продолжительность, превышающую 290 лет (приблизительно).

В этом случае продолжительность должна быть задана как (years, months, days) троичная, и следует использовать time.AddDate().

t := time.Now()
years, months, days := 15, 2, 3

end := t.AddDate(years, months, days)

См. Связанные вопросы:

time.Since () с месяцами и годами

Разница между двумя объектами time.Time

2 голосов
/ 17 января 2020

Самый идиоматический c путь будет:

duration := time.Duration(/* some amount of time */)
endDate := startDate.Add(duration)

В этом примере duration может быть любым периодом времени, вплоть до приблизительно 290 лет :

duration := 10 * time.Second   // 10 seconds
duration := 15 * time.Minute   // 15 minutes
duration := 5 * time.Hour      // 5 hours
duration := 6 * 24 * time.Hour // 6 24-hour days

et c

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