Создание DateTime в определенном Часовом поясе в c#

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

139
задан Chris Catignani 17 September 2019 в 01:46
поделиться

4 ответа

ответ Jon переговоры приблизительно TimeZone, но я предложил бы использовать TimeZoneInfo вместо этого.

Лично мне нравится сохранять вещи в UTC где возможными (по крайней мере, для прошлого; хранение UTC для будущее имеет потенциальные проблемы ), таким образом, я предложил бы структуру как это:

public struct DateTimeWithZone
{
    private readonly DateTime utcDateTime;
    private readonly TimeZoneInfo timeZone;

    public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
    {
        var dateTimeUnspec = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
        utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspec, timeZone); 
        this.timeZone = timeZone;
    }

    public DateTime UniversalTime { get { return utcDateTime; } }

    public TimeZoneInfo TimeZone { get { return timeZone; } }

    public DateTime LocalTime
    { 
        get 
        { 
            return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); 
        }
    }        
}

можно хотеть изменить имена "Часового пояса" к "TimeZoneInfo" для создания вещей более ясными - я предпочитаю более краткие имена сам.

194
ответ дан 23 November 2019 в 23:20
поделиться

Необходимо будет создать пользовательский объект для этого. Ваш пользовательский объект будет содержать два значения:

Не уверенный, если уже существует обеспеченный CLR тип данных, который имеет это, но по крайней мере компонент TimeZone уже доступен.

2
ответ дан 23 November 2019 в 23:20
поделиться

Используя класс TimeZones помогает создать часовой пояс определенная дата.

TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById(TimeZones.Paris.Id));
0
ответ дан 23 November 2019 в 23:20
поделиться

Структура DateTimeOffset была создана именно для этого типа использования.

См .: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx

Вот пример создания объекта DateTimeOffset с определенным часовым поясом:

DateTimeOffset do1 = new DateTimeOffset ( 2008, 8, 22, 1, 0, 0, новый TimeSpan (-5, 0, 0));

48
ответ дан 23 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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