1 回答

TA貢獻2021條經驗 獲得超8個贊
一些東西:
DateTime
不考慮減去值DateTimeKind
。.NET Framework 4.6 及更高版本在類中內置了與 Unix 時間之間的轉換函數
DateTimeOffset
,因此您根本不需要做任何減法。當你說
EST
orCST
時,我假設你指的是美國東部時間或美國中部時間。請記住,由于夏令時,這EDT
或CDT
可能適用于您的某些值。如果該值來自您的數據庫,則不應從字符串中進行解析。我假設你只是在這里給出了這個例子。但是在您的實際代碼中,您應該執行以下操作:
DateTime dt = (DateTime) dataReader("field");
(如果您正在使用 Entity Framework 或其他一些 ORM,那么這部分將為您處理。)
SQL Server位于哪個時區并不重要。重要的是
dbValue
您打算代表哪個時區。最佳做法是使用 UTC 時間,在這種情況下,服務器的時區應該無關緊要。如果存儲在 SQL Server 中的日期時間實際上是 UTC,那么您可以簡單地執行以下操作:
long apiValue = new DateTimeOffset(dt, TimeSpan.Zero).ToUnixTimeMilliseconds();
如果存儲在 SQL Server 中的日期時間確實是美國東部時間,那么您需要先將東部時間轉換為 UTC:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tz); long apiValue = new DateTimeOffset(utc).ToUnixTimeMilliseconds();
請注意,Windows 時區 ID
"Eastern Standard Time"
代表美國東部時間,包括適用時的美國東部時間,盡管中間有“標準”一詞。如果您在非 Windows 平臺上運行 .NET Core,請
"America/New_York"
改為傳遞。(如果您需要為跨平臺彈性編寫代碼,請使用我的TimeZoneConverter庫。)最后,雖然假設數據庫中的時間與訪問數據庫的代碼在同一本地時間可能有點危險,但如果您真的想進行這樣的賭博,您可以這樣做:
long apiValue = new DateTimeOffset(dt).ToUnixTimeMilliseconds();
這僅在
dt.Kind
isDateTimeKind.Unspecified
或時有效DateTimeKind.Local
,因為它將應用本地時區。但我再次建議不要這樣做。
- 1 回答
- 0 關注
- 108 瀏覽
添加回答
舉報