2016-10-26 26 views
8

Odziedziczyłem kod C#, który ma strasznie dużo DateTimes, gdzie właściwość Kind jest DateTimeKind.Unspecified. Są one podawane do Datetime.ToUniversalTime(), które zwraca datetime UTC (dodaje 7 godzin w moim przypadku). W ten sposób działa ToUniversalTime(); zobacz MSDN. Problem polega na tym, że te DateTimes są już w czasie UTC. Są one wyciągane z bazy danych SQL Server Compact 4.0. Były tam przechowywane w UTC. Moje główne pytanie brzmi:Jak przekonwertować DateTime typu DateTimeKind.Unspecified na DateTime.Kind.Utc w C# (.NET)

  1. Jak zmodyfikować właściwość Kind of DateTime tak, aby była UTC, a nie nieokreślona? Nie chcę zmieniać godziny ani daty. Na przykład data 1 kwietnia 2013 r., 9:05 z jego właściwością Kind o nazwie "Nieokreślony" powinna stać się datetime z 1 kwietnia 2013 r., 9:05 UTC.

Gdybym mógł być oddawał z kontynuacją pytanie (-ów), byłoby:

  1. są wartościami koniecznie zwrócony z SQL Server Compact jako "nieokreślony"? Wewnątrz Sql Server Compact są one zapisywane jako typ (datetime, not null). Patrząc na kod, wydaje się, że są one po prostu umieszczane w bazie danych, ale nie ma przepisów, które oznaczyłyby je jako UTC lub cokolwiek innego. Czy istnieje lepszy sposób radzenia sobie z rzeczami? Czy istnieje gładki sposób, aby DateTimes wyjdzie z SQL Compact jako UTC?

Proszę dać mi znać, czy mogę podać więcej szczegółów. Jestem nowy w tej bazie kodu i wciąż mam wokół niego swój mózg, więc mam problem z opisem problemu.

Dave

Odpowiedz

10

Czy może trzeba coś takiego:

var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified); 
var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc); 

O "SpecifyKind()" metoda z MSDN:

Sposób SpecifyKind tworzy nowy obiekt DateTime przy użyciu określony rodzaj parametru i oryginalna wartość czasu.

Spowoduje to utworzenie nowego obiektu, nowego rodzaju i tej samej wartości czasu. Nie można zmienić rodzaju istniejącego obiektu, trzeba utworzyć nowy o tych samych wartościach i różny rodzaj.

Odnośnie do innych pytań, oto obsługiwane typy w SQL Compact. Tutaj jest problem dotyczący DateTimeOffset. Wygląda na to, że nie jest jeszcze obsługiwany w Sql Compact.

+0

Kat1330 Dzięki za szybką odpowiedź! Spojrzałem na SpecifyKind, ale jeśli rozumiem poprawnie dokumenty (https: // msdn.microsoft.com/en-us/library/system.datetime.specifykind(v=vs.110).aspx), zmieni to DateTime. Zobacz przykłady na końcu, mają one: – Dave

+1

Jak zrozumiałem, tworzy nowy obiekt DateTime z innym rodzajem, ale z tymi samymi wartościami czasu. Zgodnie z twoim pytaniem to jest to, czego potrzebujesz? Nie można zmienić obiektu Kind of DateTime, można tylko tworzyć nowe DateTime z tymi samymi wartościami i new Kind. – kat1330

+0

Perfect Kat! Źle przeczytałem dokumenty. Tak, wierzę, że to jest odpowiedź. Zaznaczę twoją jako odpowiedź. Chciałbym pozostawić pytanie otwarte przez 1 dzień, ponieważ jestem ciekawy, czy ludzie mają opinie na temat drugiego pytania: "Czy istnieje gładki sposób, aby DateTimes wyjść z SQL Compact jako UTC?" Być może masz opinię? W tej chwili prawdopodobnie skorzystam z kodu, w którym wykona ToUniversalTime i zrobię SpecifyKind w przypadku Nieokreślonego. Ale jestem ciekaw, czy jest lepszy sposób. Być może w kodzie EntityFramework, gdy wyciągam wartości z Compact SQL? Dzięki! – Dave

2

używam metodę rozszerzenia:

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind) 
{   
    var NewDT = New DateTime(DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, DT.Second, DT.Millisecond, DTKind); 
    Return NewDT; 
} 

To znacznie krócej, aby korzystać w LINQ niż konieczności wpisywania się DateTime.SpecifyKind(unspecified, DateTimeKind.Utc) za każdym razem.

Na przykład:

table.Where((x) x.StartTimeStampUTC.SetKind(DateTimeKind.Utc).ToString("G") = GUIStartTimeStampTxt.Text) 
0

Można połączyć te dwa powyższe odpowiedzi na czystsze rozwiązanie ...

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind) 
{   
    return DateTime.SpecifyKind(DT, DTKind); 
} 
Powiązane problemy