NodaTime Добавление суммы летнего времени к ZonedDateTime - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь определить правильный метод добавления текущего количества летнего времени к ZonedDateTime. Следующий метод кажется нормальным, если сумма положительная, но мне интересно, есть ли лучший метод?

' Get the current moment in time
Dim now As Instant = SystemClock.Instance.GetCurrentInstant()                                        

' Convert to UTC time
Dim UtcDateTime As ZonedDateTime = now.InUtc                                       

' Get this computer's Local TimeZone
Dim LocalTimeZone As DateTimeZone = DateTimeZoneProviders.Tzdb.GetSystemDefault()

' Convert the UTC DateTime to the time in the Local TimeZone
Dim LocalDateTime As ZonedDateTime = UtcDateTime.WithZone(LocalTimeZone)

' The above code is just to set things up. The following code is the question:

' Check if Daylight Savings Time is in force
Dim DstInForce As Boolean = LocalDateTime.IsDaylightSavingTime

' Get the Interval for the Local TimeZone
Dim LocalInterval As ZoneInterval = LocalTimeZone.GetZoneInterval(LocalDateTime.ToInstant)

' If Daylight Savings Time is in force, add the Savings Amount
If DstInForce = True Then
    LocalDateTime.PlusSeconds(CLng(LocalInterval.Savings.ToTimeSpan.TotalSeconds))    
End If

EDITED ADDITION ..

Вот еще один рабочий пример:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim NowDateTime As LocalDateTime = New LocalDateTime(2020, 8, 5, 9, 15)
    Dim UtcZone As DateTimeZone = DateTimeZoneProviders.Tzdb("UTC")
    Dim UtcDateTime As ZonedDateTime = NowDateTime.InZoneLeniently(UtcZone)

    TextBox1.AppendText("It is currently " & UtcDateTime.ToString & " in zone " & UtcZone.ToString & vbCrLf)

    Dim ThisComputerTimeZone As DateTimeZone = DateTimeZoneProviders.Tzdb("Europe/London")
    Dim ThisComputerDateTime As ZonedDateTime = UtcDateTime.WithZone(ThisComputerTimeZone)

    ' Check if Daylight Savings Time is in force
    Dim DstInForce As Boolean = ThisComputerDateTime.IsDaylightSavingTime
    Dim ThisComputerInterval As ZoneInterval = ThisComputerTimeZone.GetZoneInterval(ThisComputerDateTime.ToInstant)
    If DstInForce = True Then
        ' If Daylight Savings Time is in force, add the Savings Amount
        ThisComputerDateTime.PlusSeconds(CLng(ThisComputerInterval.Savings.ToTimeSpan.TotalSeconds))
    End If
    TextBox1.AppendText("It is currently " & ThisComputerDateTime.ToString & " in local zone " & ThisComputerTimeZone.ToString & vbCrLf)
    TextBox1.AppendText("Daylight Savings Time is '" & DstInForce & "' and has been applied." & vbCrLf)
End Sub

Вот его результат:

It is currently 2020-08-05T09:15:00 UTC (+00) in zone UTC
It is currently 2020-08-05T10:15:00 Europe/London (+01) in local zone Europe/London
Daylight Savings Time is 'True' and has been applied.

Как видите, мне нужно было добавить дополнительную сумму экономии, чтобы изменить UT C время '09: 15 'на летнее время' 10:15 '. Что я пытаюсь сделать? Я пытаюсь создать время UT C, а затем изменить его на местное время моего компьютера с правильной суммой летнего времени. Эти шаги являются частью более крупного процесса, сокращенного для ясности.

1 Ответ

2 голосов
/ 05 августа 2020

Код после «Проверить, действует ли летнее время» не нужен - он уже учтен методом WithZone. В любом случае ваш код на самом деле не делает ничего полезного, потому что вы игнорируете результат PlusSeconds - он не изменяет существующий ZonedDateTime, он возвращает новый.

Эта строка:

Dim ThisComputerDateTime As ZonedDateTime = UtcDateTime.WithZone(ThisComputerTimeZone)

... делает все, что вам нужно. WithZone уже учитывает летнее время. Нет необходимости пытаться настроить его вручную.

...