MySql中當前時間,不能直接使用Date.Now傳輸。猜測:這個可能跟伺服器地理位置有關係;一般國外的伺服器時間展示位:月/日/年; 國內通常為:年-月-日;猜測,使用的時候應註意檢查 如下麵的代碼,可能會導致查詢數據不准:應改為:Date.Now.ToString("yyyy-MM-dd HH: ...
MySql中處理字元串時間,會預設把第一個數字當成年份處理。
在C#伺服器中,使用Date.Now.ToString()生成的字元串時間,如果不指定字元串格式,C#會按照系統語言輸出不同的字元串格式,如:
a. 美國: 06/01/2019 01:59:00 PM
b.中國: 2019/06/01 13:59:00
原因分析:進過翻閱很多資料,彙總一下,發現,Date.Now預設轉字元串時跟一個類有關:System.Globalization.CultureInfo(提供有關特定區域性(對於非托管代碼開發,則稱為“區域設置”)的信息。 這些信息包括區域性的名稱、書寫系統、使用的日曆、字元串的排序順序以及對日期和數字的格式化設置。)
參考:https://docs.microsoft.com/zh-cn/dotnet/api/system.globalization.cultureinfo?view=netframework-4.7.2
可以通過屬性:System.Threading.Thread.CurrentThread.CurrentCulture 獲取當前線程使用的區域語言;這裡,一般國內的伺服器操作系統一般都是中文Windows系統,所以使用的英文版Windows或者linus系統等,會導致線程的區域語言有區別。
而微軟通過這個類,對不同系統的用戶做了人性化的處理,如:對時間的顯示格式存在差別。設置後對伺服器代碼部署到不同地區的開發者來說,便於對日期等格式的統一化管理!
解決方案:
1-臨時修改線程中的區域語言為中文模式:
System.Threading.Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo("zh-CN");
2-使用全局配置模式:globalization節點下添加屬性:culture="zh-CN" uiCulture="zh-CN"
<system.web> <compilation debug="true" targetFramework="4.5" /> <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN" /> </system.web>
3-Date.Now.ToString("yyyy-MM-dd HH:mm:ss") 指定日期類型,避免使用:string.format(@"{0}",Date.Now)或者Date.Now.ToString()這樣的預設字元串格式。
Date.Now.ToString("yyyy-MM-dd HH:mm:ss")
4-使用Mysql自帶的獲取當前時間方法: now()
select now() --獲取當前時間
總結:需要註意的事,前面2中解決方案解決了問題根源;後2中方案只是繞過了這個問題,但是對於後來的新同學可能還會犯同樣的錯誤,所以推薦前面兩種方案,這樣在寫當前時間的時候,你隨意怎麼寫。
另外像:月/日/年 小時:分 這樣的時間格式,SqlServer是支持的,這裡給SqlServer的強大點個贊!!!
備註幾個本人查閱很多資料的地址,或許對大家有其他參考價值:
https://www.c-sharpcorner.com/article/datetime-in-c-sharp/
錯誤實例一:如下麵的代碼,在英文版的windows系統下,會導致查詢數據不准:應改為:Date.Now.ToString("yyyy-MM-dd HH:mm")
/// <summary> /// (用戶ID) => 用戶優惠碼可用數量 /// </summary> /// <param name="userId">用戶ID</param> /// <returns></returns> public static int GetCouponCount(int userId) { int count = 0; if (userId > 0) { List<string> whereList = new List<string> { string.Format("`{0}` = '{1}'", Coupon_user_mapping._USERID_, userId), string.Format("`{0}` = '{1}'", Coupon_user_mapping._STATUS_, ECoupon.Status.可用.GetValue()), string.Format("`{0}` > '{1}'", Coupon_user_mapping._USEENDTIME_, DateTime.Now) }; string where = string.Join(" AND ", whereList); whereList.Clear(); whereList = null; Coupon_user_mappingBLL.Select(where, out count); } return count; }
下麵是本公司伺服器時間測試截圖:左側為中文windows系統,右側為英文版windows系統。 在設置CultureInfo區域語言後,英文的系統展示時間也可以為左側的標準格式了。