1 回答

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