c#時分秒毫秒微妙_你真的清楚DateTime in C#嗎?

DateTime,就是一個世界的大融合。

日期和時間,在我們開發中非常重要。DateTime在C#中,專門用來表達和處理日期和時間。

本文算是多年使用DateTime的一個總結,包括DateTime對象的整體應用,以及如何處理不同的區域、時區、格式等內容。

一、什么是DateTime

跟我們想的不一樣,DateTime不是一個類(class),而是一個結構(struct),它存在于System命名空間下,在Dotnet Core中,處于System.Runtime.dll中。

看一下DateTime的定義:

public?struct?DateTime?:?IComparable,?IComparable,?IConvertible,?IEquatable,?IFormattable,?System.Runtime.Serialization.ISerializable

從定義可以知道,DateTime實現了IComparableIConvertibleIEquatableIFormattableISerializable。因此,DateTime可以讓我們使用有關日期和時間的很多相關信息。

二、構造

初始化一個DateTime對象,C#提供了11種方式進行初始化,根據需要,可以使用年月日時分秒,以及Ticks

Ticks是C#里一個獨特的定義,它是以公歷0001年1月1日00:00:00.000以來所經歷的以100納秒為間隔的間隔數。我們知道,納秒、微秒、毫秒和秒之間都是1000倍的關系,所以,1毫秒等于10000Ticks。這個數字很重要。在C#到Javascript時間轉換時,需要很清楚這個對應關系。

DateTime?date1?=?new?DateTime(2020,?7,?14);
DateTime?date2?=?new?DateTime(2020,?7,?14,?14,?23,?40);
DateTime?date3?=?new?DateTime(637303334200000000);

三、靜態字段

DateTime包括三個靜態字段:

MinValue - DateTime的最小值,對應公歷0001年1月1日00:00:00.000,Ticks為0;

MaxValue - DateTime的最大值,對應公歷9999看12月31日23:59:59.999,Ticks為3155378975999999999;

UnixEpoch - Unix、Javascript下的時間起點,對應公歷1970年1月1日00:00:00.000,Ticks為621355968000000000;

在Javascript中,時間保存的是從UnixEpoch開始,即從1970年1月1日00:00:00.000開始到現在的毫秒數。所以,C#時間到Javascript時間的轉換,可以用以下代碼:

public?static?long?ToUnixTicks(this?DateTime?time){
????return?(long)TimeSpan.FromTicks(time.Ticks?-?DateTime.UnixEpoch.Ticks).TotalMilliseconds?-?TimeZoneInfo.Local.GetUtcOffset(time).Hours?*?60?*?60?*?1000;
}

在Javascript中引入時間:

var?time?=?new?Date().setTime(unix_ticks);

就完成了轉換。

四、方法

DateTime提供了很多種方法來操作DateTime對象,用于處理諸如向日期添加天數、小時、分鐘、秒、日期差異、從字符串解析到datetime對象、獲得通用時間等等。這兒就不詳細說了,需要了可以查微軟文檔,很詳細。

給幾個例子:

TimeSpan?duration?=?new?System.TimeSpan(30,?0,?0,?0);
DateTime?newDate1?=?DateTime.Now.Add(duration);

DateTime?today?=?DateTime.Now;
DateTime?newDate2?=?today.AddDays(30);

string?dateString?=?"2020-07-14?14:23:40";
DateTime?dateTime12?=?DateTime.Parse(dateString);

DateTime?date1?=?new?System.DateTime(2020,?7,?13,?14,?20,?10);
DateTime?date2?=?new?System.DateTime(2020,?7,?14,?14,?25,?40);
DateTime?date3?=?new?System.DateTime(2020,?7,?14,?14,?25,?40);

TimeSpan?diff1?=?date2.Subtract(date1);
DateTime?date4?=?date3.Subtract(diff1);
TimeSpan?diff2?=?date3?-?date2;

DateTime?date5?=?date2?-?diff1;

五、屬性

DateTime提供了年月日時分秒、以及其它一些屬性,用來方便提取日期中的細節。

DateTime?myDate?=?new?DateTime(2020,?7,?14,?14,?23,?40);
int?year?=?myDate.Year;?
int?month?=?myDate.Month;
int?day?=?myDate.Day;
int?hour?=?myDate.Hour;
int?minute?=?myDate.Minute;
int?second?=?myDate.Second;
int?weekDay?=?(int)myDate.DayOfWeek;
string?weekString?=?myDate.DayOfWeek.ToString();

其中,DayOfWeek,是用來判斷日期是星期幾的,它是一個枚舉值。注意,按照慣例,一周是從周日開始的,所以,0表示周日,6表示周六。

DateTimeKind,用來定義實例表示的時間是基于本地時間(LocalTime)、UTC時間(UTC)或是不指定(Unspecified)。

在大多數情況下,我們定義時間就直接定義年月日時分秒,例如下面:

DateTime?myDate?=?new?DateTime(2020,?7,?14,?14,?23,?40);

這種定義下,這個時間就是Unspecified的。

在使用時,如果應用過程中不做時間轉換,始終以這種方式用,那不會有任何問題。但在某些情況下,時間有可能會發生轉換,例如跨國應用的時間處理,再例如MongoDB,在數據庫保存數據時,強制使用UTC時間。這種情況下,處理時間就必須采用LocalTimeUTC時間:

DateTime?myDate?=?new?DateTime(2020,?7,?14,?14,?23,?40,?DateTimeKind.Local);

DateTime?myDate?=?new?DateTime(2020,?7,?14,?14,?23,?40,?DateTimeKind.Unspecified);

否則,在時間類型不確定的情況下,時間轉換會出現問題。

看看下面的例子:

DateTime?myDate?=?new?DateTime(2020,?7,?14,?14,?23,?40);

var?date1?=?myDate.ToLocalTime();
Console.WriteLine(date1.ToString());
/*?7/14/2020?22:23:40?PM?*/

var?date2?=?myDate.ToUniversalTime();
Console.WriteLine(date2.ToString());
/*?7/14/2020?6:23:40?AM?*/

當使用ToLocalTime方法時,Unspecified時間會認為自己是UTC時間,而當使用ToUniversalTime時,Unspecified時間又會認為自己是LocalTime時間,導致時間上的轉換錯誤。

關于MongoDB處理時間的相關內容,可以去看我的另一個文章:MongoDB via Dotnet Core數據映射詳解

六、時間對象的加減及比較

DateTime時間對象的加減及比較非常方便。看例子:

DateTime?date1?=?new?System.DateTime(2020,?7,?14);

TimeSpan?timeSpan?=?new?System.TimeSpan(10,?5,?5,?1);
DateTime?addResult?=?date1?+?timeSpan;
DateTime?substarctResult?=?date1?-?timeSpan;?

DateTime?date2?=?new?DateTime(2020,?7,?14);
DateTime?date3?=?new?DateTime(2020,?7,?15);

bool?isEqual?=?date2?==?date3;

七、日期的格式化

日期的格式化是相關DateTime網上詢問和查找最多的內容。

有這么一個表:

0e81052c8262b367b1513e8e703b5250.png

對照這個表就可以:

date.ToString("yyyy-MM-dd?HH:mm:ss");

八、陰歷

DateTime本身依賴于日歷Calendar類。Calendar是一個抽象類,在System.Globalization命名空間下,也在System.Runtime.dll中。而在Calendar類下面,提供了很多不同類型的日歷。跟我們有關系的,是中國的陰歷ChineseLunisolarCalendar

使用也很簡單:

Calendar?calendar?=?new?ChineseLunisolarCalendar();

DateTime?date?=?new?DateTime(2020,?06,?24,?calendar);
/*?7/14/2020?00:00:00?AM?*/

嗯嗯,經常看陰歷的伙伴們會看出一點問題:今天是陰歷5月24,為什么這兒寫的是6月24呢?這個是因為今天閏4月,所以,陰歷5月實際是這一個陰歷年的第6個月。

那如何判斷哪個月是否閏月呢?

Calendar?calendar?=?new?ChineseLunisolarCalendar();

bool?is_leapYear?=?calendar.IsLeapYear(2020);
bool?is_leapMonth?=?calendar.IsLeapMonth(2020,?5);
bool?is_leapDay?=?calendar.IsLeapDay(2020,?5,?26);

同樣,我們也可以用公歷轉陰歷:

DateTime?date?=?DateTime.Now;

Calendar?calendar?=?new?ChineseLunisolarCalendar();

int?year?=?calendar.GetYear(date);
/*?2020?*/
int?month?=?calendar.GetMonth(date);
/*?6?*/
int?day?=?calendar.GetDayOfMonth(date);
/*?24?*/

以上就是全部內容了。

有沒有發現,微軟實現的功能,比我們想像的要多?

(全文完)

喜歡就來個三連,讓更多人因你而受益

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(HY000): Cannot modify @@session.sql_log_bin inside a transaction

昨天,線上發生一例(HY000): Cannot modify session.sql_log_bin inside a transaction代碼缺少顯示的start transaction控制。。轉載于:https://www.cnblogs.com/zhjh256/p/5775390.html

解決Eclipse的Team菜單中沒有SVN選項的問題

剛開始自己拿一個項目,手練一下發覺在Eclipse的Team找不到SVN倉庫,看了一下才發覺使用SVN向SVN服務器上傳代碼,但Eclipse默認情況下卻沒有SVN選項,剛開始也是這樣的 默認只有GIT,如下圖所示 想要解決這些問題&#xff…

怎么用計算機怎么截屏,電腦怎么截圖 這幾個方法操作簡便且實用

在日常的生活當中我們在使用電腦的時候經常會碰一些喜歡的文字、圖片無法保存的情況,面對這樣的狀況,我們想要將這些東西保留下來那就會用到電腦截圖了,這個方法可以很輕松的就將我們無視無法保存的情況而將這些東西給保留下來。那么電腦要怎…

python socket 多人聊天室

參考來源(其實我從上面復制了一點):Python 的 Socket 編程教程 http://www.oschina.net/question/12_76126Python線程指南 http://www.open-open.com/lib/view/open1345476194313.htmlPython Socket文檔 https://docs.python.org/3/library/…

json數據轉換成表格_電子表格會讓您失望嗎? 將行數據轉換為JSON樹很容易。

json數據轉換成表格Like many of you, I often have to take the result of SQL queries and convert the rowsets to JSON data objects. Sometimes I have to do the same with CSV files from spreadsheets. The transformation process can be a hassle, though anyone can…

mxm智能教育機器人無法智能對話_零代碼使用騰訊TBP打造智能對話機器人

點擊觀看大咖分享心疼你獨自一人承擔生活的苦難,寂寞夜里陪伴你的只剩無人傾訴的壓抑和無處安放的焦慮。養個寵物,它卻不能get到你的“寵言寵語”。找個伴侶,還要浪費吵架的時間和精力。回到家里,只能浸泡在“循環嘮叨式“母愛的沐…

MyGeneration代碼生成工具

使用MyGeneration 生成代碼:轉自http://www.cnblogs.com/jack-liang/archive/2011/08/18/2144066.html我們經常用數據訪問層和業務邏輯層,用MyGeneration就可以自動生成這些代碼,我們可以不用手動寫代碼了。比如數據訪問層,我們需…

數據庫部分重點內容回顧

1.什么是聚集索引? 樹形結構將數據組織和存儲起來,起到加速查詢的效果 2.主鍵索引怎么添加? (1)聚集索引(主鍵索引)的添加方式,創建時添加 方式一: Create table t1( id int primary key, ) 方式二: Create table t1( Id int, Primary key(id) ) (2)唯一索引創建時添加: 方式…

keytool 錯誤: java.io.IOException: Keystore was tampered with, or password was incorrect

1.這里需要輸入的密碼不是證書的密碼執行keytool -import -keystore - file 這個命令提示需要輸入密碼進入jdk的bin目錄,執行以下腳本,keytool -import -alias saltapi -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre…

怎么更換鎖定計算機的圖片,Win10系統下怎樣對鎖定界面的背景圖片進行更換

用戶在喚醒睡眠狀態的win10系統時,最先看到就是鎖定界面。在界面中,一般有時間日期、星期幾,及默認的背景圖片。那么,win10系統鎖定界面中的背景圖片可以修改嗎?下面,小編就給大家分享Win10系統更換鎖定界面…

輸電線路巡檢機器人PPT_“高空大師”來了!架空輸電線路智能巡檢機器人在寧波投運...

“鄞州區220千伏天田4480線一切正常……”17日上午,隨著一臺智能巡檢機器人穩穩地停靠在鐵塔邊,標志著我省首臺架空輸電線路智能巡檢機器人在寧波率先投入運行,為電網安全運行請來了一位“高空大師”。近年來,無人機代替電力工人巡…

HDU 6325 Problem G. Interstellar Travel(凸包)

題意: 給你n個點,第一個點一定是(0,0)&#xff0c;最后一個點縱坐標yn一定是0&#xff0c;中間的點的橫坐標一定都是在(0,xn)之間的 然后從第一個點開始飛行&#xff0c;每次飛到下一個點j&#xff0c;你花費的價值就是xi*yj-xj*yi&#xff0c;并且這里每一次飛行必須滿足xi<…

UIView封裝動畫--iOS利用系統提供方法來做關鍵幀動畫

iOS利用系統提供方法來做關鍵幀動畫 ios7以后才有用。 /*關鍵幀動畫options:UIViewKeyframeAnimationOptions類型*/[UIView animateKeyframesWithDuration:5.0 delay:0 options: UIViewAnimationOptionCurveLinear| UIViewAnimationOptionCurveLinear animations:^{//第二個關鍵…

JavaScript —從回調到異步/等待

JavaScript is synchronous. This means that it will execute your code block by order after hoisting. Before the code executes, var and function declarations are “hoisted” to the top of their scope.JavaScript是同步的。 這意味著它將在提升后按順序執行代碼塊。…

關于解決工作中的自動化環境搭建的解決方案(序)

時間&#xff1a;2015~2017 之前的自動化搭建平臺&#xff1a;robotest 安裝工具&#xff1a;jdk1.8,robotest 這種工具反正超級好用&#xff0c;華為方搞得工具&#xff0c;前臺操作超級傻瓜。會點xpatch&#xff0c;一些東西根本不在話下。但是坑爹的就是&#xff0c;出了外包…

xshell安裝mysql步驟_mysql主從復制

前期提要&#xff1a;三年前雙11買的阿里云今年到期了&#xff0c;win2012的&#xff0c;上面mysql數據庫里記著自己的一些記賬數據&#xff0c;上一年雙11買了騰訊云的&#xff0c;centos7.7, 想學學MYSQL的復制功能&#xff0c;今天趁著無BUG可擼&#xff0c;試著配置了一下&…

大專學計算機維修,《計算機維修與網絡工程》大專學歷班

語文、數學、計算機英語、公文寫作等辦公自動化指法訓練、英文打字、智能拼音及高速五筆字型中文打字、windows操作、Word2003文字處理軟件、Excel2003電子表格、Powerpoint2003幻燈片制作、Internet網絡的上網方法、瀏覽、下載、電子郵件收發等。本班學習完畢&#xff0c;可獨…

webpack指定第三方模塊的查找路徑

通常我們會使用一些地方模塊在我們的項目中&#xff0c;比如bootstrap import bootstrap 導入的bootstrap默認會查找當前目錄的node_modules文件&#xff0c;但是如果這個文件沒有&#xff0c;會依次往上級模塊查找&#xff0c;直到到C盤的根目錄為止&#xff0c;可以通過webpa…

我的第一個安卓應用程序_我如何設計我的第一個應用程序

我的第一個安卓應用程序by Daniel Novykov丹尼爾諾維科夫(Daniel Novykov) 我如何設計我的第一個應用程序 (How I Designed My First App) This is a story about building a product, what went wrong, and how it changed my career into Design.這是一個有關構建產品&#…

Appium——主從控制執行

1.客戶端(Eclipse)機器A&#xff0c; 服務端(appium、Genymotion)機器B 2.設置Appium&#xff0c;Server Address為192.168.17.123&#xff0c;重新啟動Appium 3.在客戶端機器A瀏覽器中輸入&#xff1a;http://192.168.17.123:4723/wd/hub&#xff0c; 說明配置成功。 JAVA代碼…