DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.19k stars 1.32k forks source link

設定DateTimeKind的默認值 #1169

Closed Yumitoya8569 closed 1 year ago

Yumitoya8569 commented 1 year ago

環境

SqlSugarCore 5.1.4.84

問題

對應到Oracle的Date欄位 SqlSugar映射後DateTime類型為 DateTimeKind.Unspecified

如果專案在設計層上假定資料庫所有不帶時區的時間都默認為UTC+0 是否有方法設置DateTime默認映射為DateTimeKind.Utc?

DotNetNext commented 1 year ago

能说出具体例子吗,是插入还是查询(查询是驱动自带的绑定)

DotNetNext commented 1 year ago

https://www.donet5.com/Home/Doc?typeId=2542 你看看这个自定义类型是否能满足你的需求

Yumitoya8569 commented 1 year ago

是查詢, 我再研究看看

Yumitoya8569 commented 1 year ago

研究後發現dotnet的DateTime原生設計很有問題

在運算時根本不考慮DateTimeKind

DateTime unTime = new DateTime(2023, 7, 4, 10, 0, 0, DateTimeKind.Unspecified);
DateTime utcTime = new DateTime(2023, 7, 4, 10, 0, 0, DateTimeKind.Utc);
Console.WriteLine(unTime == utcTime); // True

默認轉換器轉換成JSON格式時卻不同

// 轉換成 2023-07-04T10:00:00
DateTime unTime = new DateTime(2023, 7, 4, 10, 0, 0, DateTimeKind.Unspecified); 

// 轉換成 2023-07-04T10:00:00Z
DateTime utcTime = new DateTime(2023, 7, 4, 10, 0, 0, DateTimeKind.Utc);

該格式在js的默認行為又不同

// 轉換成本機時間
new Date('2023-07-04T10:00:00')

// 轉換成UTC+0
new Date('2023-07-04T10:00:00Z')

這個設計真的絕了

結論

參考您提供的方案要在每個模型上設定Converter較繁瑣 而且C#運算時不考慮DateTimeKind 所以目前不打算在C#上處理這個問題了

謝謝

DotNetNext commented 1 year ago

好的。