我試圖讓 C# 和 JS 在 JSDate和 .NETDateTime對象上添加分鐘數時生成相同的結果。我的系統使用希臘文化設置,但很可能您會在您的計算機上得到類似的結果(如果您使用這些值)。我有這個使用 moment.js 的 JS 代碼:var dt1 = new Date(2020, 0, 19, 0, 0, 0);var m1 = moment(dt1);[m1.toString(), m1.add(100980, 'minutes').toString()]> ["Sun Jan 19 2020 00:00:00 GMT+0200", "Sun Mar 29 2020 04:00:00 GMT+0300"]..LinqPad 中的 C# 代碼:var ci = CultureInfo.CreateSpecificCulture("el-GR"); //CultureInfo.InvariantCulture; //CultureInfo.CurrentCulture;var dt = new DateTime(2020, 1, 19, 0, 0, 0, 0, ci.Calendar, DateTimeKind.Local);dt.ToString("G", ci).Dump();var dt2 = dt.AddMinutes(100980);dt2.ToString("G", ci).Dump();> 19/1/2020 12:00:00 πμ> 29/3/2020 3:00:00 πμ...并且在使用不變文化進行打印時:var ci = CultureInfo.CreateSpecificCulture("el-GR"); //CultureInfo.InvariantCulture; //CultureInfo.CurrentCulture;var dt = new DateTime(2020, 1, 19, 0, 0, 0, 0, ci.Calendar, DateTimeKind.Local);dt.ToString("G", CultureInfo.InvariantCulture).Dump();var dt2 = dt.AddMinutes(100980);dt2.ToString("G", CultureInfo.InvariantCulture).Dump();> 01/19/2020 00:00:00> 03/29/2020 03:00:00有人能告訴我為什么會得到不同的結果嗎?系統設置是相同的,我嘗試使用兩者CurrentCulture,但 CreateSpecificCulture("el-GR")沒有得到與 JS 結果有任何相似之處。我什至用JS創建了自己的addMinutes(),但仍然有同樣的問題??雌饋?JS 正好在開始日期后的 100980 分鐘執行夏令時切換(如果添加 100979 分鐘,您就會看到這一點),但 C# 卻沒有!根據維基百科,JS 的行為是正確的行為。但到目前為止我非常確定 .NET 也是正確的。根據我所做的快速測試,C# 似乎在 70.2 天前進行了切換。在向日期添加分鐘數時,為了在兩種語言之間獲得相同的結果,我需要做什么?
2 回答

Helenr
TA貢獻1780條經驗 獲得超4個贊
問題是調用是在withAddMinutes
上完成的。盡管有這種標記,但對象的數學運算并不考慮時區。 即使是當地時間。DateTime
DateTimeKind.Local
DateTime
由于您使用的是本地類型,因此您可以簡單地轉換為 UTC,進行數學計算,然后再轉換回來。
var dt2 = dt.ToUniversalTime().AddMinutes(100980).ToLocalTime();
您可能還想考慮使用該DateTimeOffset
類型,并使用TimeZoneInfo.ConvertTime
.

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
NodaTime
正如我在問題更新中所寫的那樣,我最終使用了。
它仍然不同意moment.js
所有的時間,但我覺得它更經常地同意它。
我想夏令時是一個巨大的混亂,沒有人能夠很好地處理它。
- 2 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消