2014-11-10 3 views
1

У меня есть следующая реализация, использующая базовый UtcNow, а затем преобразование его обратно в пользовательский интерфейс. Цель этого сценария очень проста. Когда я вставляю новый клиент в базу данных, я конвертирую его в UtcNow, поэтому у меня есть отметка времени для этой записи. Когда я показываю его пользователю, я конвертирую его в локальный (например: вы являетесь участником с «dd/MM/yyyy»).Как сохранить временную метку с помощью NodaTime?

Вот моя реализация. Я хотел бы знать, как это сделать через NodaTime. А также, если у кого-то есть лучший подход для этого, я буду рад услышать!

public interface IDateTime 
{ 
    DateTime ToUtcNow { get; } 
    DateTime FromUtc(DateTime dateTimeToConvert); 
} 

public class DateTimeProvider : IDateTime 
{ 
    public DateTime ToUtcNow 
    { 
     get { return DateTime.UtcNow; } 
    } 

    public DateTime FromUtc(DateTime dateTimeToConvert) 
    { 
     return dateTimeToConvert.ToLocalTime(); 
    } 
} 

Также, как его сохранить в базе данных, в данном случае Sql Server. Какой тип данных я должен использовать? DateTime, DateTimeOffset? Как насчет кода? OffsetDateTime, ZonedDateTime Я очень смущен этим. Я прочитал userguide, но он показывает более сложные сценарии, которые я не могу реализовать в таком простом сценарии.

Заранее благодарен!

ответ

1

Похоже, вы пытаетесь сохранить точки во времени, независимо от системы календаря или часового пояса. Они представлены значениями Instant в Noda Time. Поэтому в большинстве ваших кодов это, вероятно, то, что вы должны использовать для представления метки времени. (Это также то, что IClock.Now даст вам.)

Однако база данных вряд ли знать о Нода времени ... Я хотел бы предложить, что вы, вероятно, следует хранить DateTimeOffset, который можно получить с помощью Instant.ToDateTimeOffset (и есть Instant.FromDateTimeOffset слишком). Это всегда будет иметь смещение 0, но по крайней мере тогда это не является двусмысленным относительно того момента, который он представляет.