C#中的時(shí)間戳

來(lái)源:https://blog.guoqianfan.com/2019/11/24/timestamp-in-csharp/

什么是時(shí)間戳

時(shí)間戳默認(rèn)是Unix時(shí)間戳

首先要清楚JavaScript與Unix的時(shí)間戳的區(qū)別:

JavaScript時(shí)間戳:是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總毫秒數(shù)肌似。

Unix時(shí)間戳:是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)

可以看出JavaScript時(shí)間戳是總毫秒數(shù)力细,Unix時(shí)間戳是總秒數(shù)眠蚂。

比如同樣是的 2016/11/03 12:30:00 斗躏,轉(zhuǎn)換為JavaScript時(shí)間戳為 1478147400000;轉(zhuǎn)換為Unix時(shí)間戳為 1478147400笛臣。

從上面也可以看出時(shí)間戳與時(shí)區(qū)無(wú)關(guān)捐祠。

Unix時(shí)間戳相互轉(zhuǎn)換

C# DateTime轉(zhuǎn)換為Unix時(shí)間戳

.NET 4.6新方法

只能在 .NET 4.6及更高版本里才能使用。

long timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); // 相差秒數(shù)
Console.WriteLine(timeStamp);

通用的老方法

System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū)
long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒數(shù)
System.Console.WriteLine(timeStamp);

Unix時(shí)間戳轉(zhuǎn)換為C# DateTime

.NET 4.6新方法

由時(shí)間戳轉(zhuǎn)換的DateTimeOffset的時(shí)區(qū)默認(rèn)是+00:00窿给,此時(shí)我們需要轉(zhuǎn)為本地時(shí)區(qū)崩泡,否則后續(xù)使用可能會(huì)有問(wèn)題角撞。

轉(zhuǎn)為本地時(shí)區(qū):DateTimeOffset.LocalDateTime勃痴。

示例代碼如下:

//默認(rèn)為UTC時(shí)間:{2019/11/14 1:53:26 +00:00}
DateTimeOffset dto = DateTimeOffset.FromUnixTimeMilliseconds(1573696406184);
//默認(rèn)為UTC時(shí)間:{2019/11/14 1:53:26}
DateTime dt01 = dto.DateTime;
//轉(zhuǎn)為本地時(shí)區(qū):{2019/11/14 9:53:26}
DateTime dt02 = dto.LocalDateTime;

通用的老方法

long unixTimeStamp = 1478162177;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū)
DateTime dt = startTime.AddSeconds(unixTimeStamp);
System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));

備注

DateTimeOffset使用Now還是UtcNow

對(duì)于DateTimeOffset沛申,發(fā)現(xiàn)有2個(gè)獲取當(dāng)前時(shí)間的屬性:DateTimeOffset.NowDateTimeOffset.UtcNow

如果只是獲取時(shí)間戳尖淘,這2個(gè)使用哪個(gè)都可以著觉,得到的值是一樣的饼丘。

因?yàn)?code>DateTimeOffset里面有時(shí)區(qū)信息,獲取時(shí)間戳?xí)r會(huì)使用時(shí)區(qū)進(jìn)行轉(zhuǎn)換的镇辉,所以獲得的時(shí)間戳一樣屡穗。

而也是因?yàn)闀r(shí)區(qū)的原因村砂,DateTimeOffset的其他操作可能會(huì)不一樣烂斋。例如DateTimeOffset.DateTime就不一樣罕模,此時(shí)推薦使用DateTimeOffset.LocalDateTime來(lái)獲得本地時(shí)區(qū)的時(shí)間淑掌。

測(cè)試代碼如下:

//none:2019/6/14 15:17:43 +08:00
Console.WriteLine("none:{0}", DateTimeOffset.Now);
//utc:2019/6/14 7:17:43 +00:00
Console.WriteLine("utc:{0}", DateTimeOffset.UtcNow);

//none:1560496663
Console.WriteLine("none:{0}", DateTimeOffset.Now.ToUnixTimeSeconds());
//utc:1560496663
Console.WriteLine("utc:{0}", DateTimeOffset.UtcNow.ToUnixTimeSeconds());

DateTime轉(zhuǎn)換為DateTimeOffset

可以直接把DateTime賦值給DateTimeOffset蝶念,內(nèi)部會(huì)自動(dòng)進(jìn)行隱式轉(zhuǎn)換。這里涉及到時(shí)區(qū)担敌,請(qǐng)往下看全封。

DateTime的時(shí)區(qū)信息(Kind屬性)

DateTime時(shí)區(qū)信息存放在Kind屬性里桃犬。Kind屬性的數(shù)據(jù)類(lèi)型是DateTimeKind枚舉刹悴,只有3個(gè)值:

  • Unspecified:未指定/未規(guī)定
  • UtcUTC時(shí)間
  • Local:本地時(shí)區(qū)

不同情況下得到的DateTimeKind是不同的,具體如下:

  • DateTime.NowDateTime.KindLocal(本地時(shí)區(qū))攒暇。

  • DateTime.UtcNowDateTime.KindUtc颂跨。

  • DateTime.Parse()

    • 默認(rèn)】在未指定時(shí)區(qū)時(shí),DateTime.KindUnspecified

    • 指定時(shí)區(qū):指定時(shí)區(qū)后DateTime.Kind就是相對(duì)應(yīng)的值扯饶。

      指定時(shí)區(qū)有2種方式:

      • 默認(rèn)+優(yōu)先待轉(zhuǎn)換的字符串里有時(shí)區(qū)信息恒削。例如:2019/11/24 17:40:32 +08:00
      • 使用DateTimeStyles參數(shù)來(lái)指定時(shí)區(qū)。DateTimeStyles是枚舉類(lèi)型尾序,更多信息自己查看定義钓丰,這里不再多說(shuō)。

LocalUtc都會(huì)把相應(yīng)的時(shí)區(qū)傳遞過(guò)去每币。對(duì)于 Unspecified(未指定)携丁,會(huì)被當(dāng)做本地時(shí)區(qū)來(lái)處理(結(jié)果已驗(yàn)證梦鉴,源碼沒(méi)看懂)。

測(cè)試代碼

//dtNow:2019/11/24 17:40:32(Kind:Local)
DateTime dtNow = DateTime.Now;
//dtUtcNow:2019/11/24 9:40:32(Kind:Utc)
DateTime dtUtcNow = DateTime.UtcNow;
//dtParse:2019/11/24 17:40:13(Kind:Unspecified)
DateTime dtParse = DateTime.Parse("2019-11-24 17:40:13");

//dtoNow:2019/11/24 17:40:32 +08:00
DateTimeOffset dtoNow = dtNow;
//dtoUtcNow:2019/11/24 9:40:32 +00:00
DateTimeOffset dtoUtcNow = dtUtcNow;
//dtoParse:2019/11/24 17:40:13 +08:00
DateTimeOffset dtoParse = dtParse;

Console.WriteLine("DateTime:");
Console.WriteLine("dtNow:{0}(Kind:{1})", dtNow, dtNow.Kind);
Console.WriteLine("dtUtcNow:{0}(Kind:{1})", dtUtcNow, dtUtcNow.Kind);
Console.WriteLine("dtParse:{0}(Kind:{1})", dtParse, dtParse.Kind);

Console.WriteLine();

Console.WriteLine("DateTimeOffset:");
Console.WriteLine("dtoNow:{0}", dtoNow);
Console.WriteLine("dtoUtcNow:{0}", dtoUtcNow);
Console.WriteLine("dtoParse:{0}", dtoParse);

輸出結(jié)果如下:

DateTime:
dtNow:2019/11/24 17:40:32(Kind:Local)
dtUtcNow:2019/11/24 9:40:32(Kind:Utc)
dtParse:2019/11/24 17:40:13(Kind:Unspecified)

DateTimeOffset:
dtoNow:2019/11/24 17:40:32 +08:00
dtoUtcNow:2019/11/24 9:40:32 +00:00
dtoParse:2019/11/24 17:40:13 +08:00

DateTimeOffset.Parse的默認(rèn)時(shí)區(qū)

DateTimeOffset.Parse的默認(rèn)時(shí)區(qū)是當(dāng)前時(shí)區(qū)宠互。

//parse:2019/6/14 15:38:49 +08:00
Console.WriteLine("parse:{0}", DateTimeOffset.Parse("2019-6-14 15:38:49"));

參考

  1. C# DateTime與時(shí)間戳轉(zhuǎn)換:https://www.cnblogs.com/polk6/p/6024892.html
  2. 如何將Unix時(shí)間戳轉(zhuǎn)換為DateTime,反之亦然券册?:https://stackoverflow.com/questions/249760/how-can-i-convert-a-unix-timestamp-to-datetime-and-vice-versa
  3. DateTimeOffset源碼:https://source.dot.net/#System.Private.CoreLib/DateTimeOffset.cs
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末集币,一起剝皮案震驚了整個(gè)濱河市鞠苟,隨后出現(xiàn)的幾起案子吃既,更是在濱河造成了極大的恐慌鹦倚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異划址,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胁勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抚恒,“玉大人,你說(shuō)我怎么就攤上這事混萝∫萼郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悉患。 經(jīng)常有香客問(wèn)我坞淮,道長(zhǎng),這世上最難降的妖魔是什么毫玖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任驰怎,我火速辦了婚禮县忌,結(jié)果婚禮上装获,老公的妹妹穿的比我還像新娘凡简。我一直安慰自己,他們只是感情好筐眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布津畸。 她就那樣靜靜地躺著后频,像睡著了一般卑惜。 火紅的嫁衣襯著肌膚如雪露久。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音臊泰,去河邊找鬼缸逃。 笑死丁眼,一個(gè)胖子當(dāng)著我的面吹牛嵌施,可吹牛的內(nèi)容都是我干的吃靠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼越走,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼廊敌!你這毒婦竟也來(lái)了掷空?” 一聲冷哼從身側(cè)響起疼电,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤修陡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后旺罢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蠢熄,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叉讥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帚豪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌执。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖赋,死狀恐怖杭抠,靈堂內(nèi)的尸體忽然破棺而出钝的,到底是詐尸還是另有隱情沿猜,我是刑警寧澤望薄,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布卧须,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隘击。R本人自食惡果不足惜棵红,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一浩峡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧平斩,春花似錦侈沪、人聲如沸瘦馍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春惋嚎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工讯检, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誊涯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓砾隅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • MySql取得日期(前一天、某一天) 取得當(dāng)天: SELECT curdate(); mysql> SELECT ...
    laravel閱讀 1,649評(píng)論 0 4
  • 在Python中,日期和時(shí)間的應(yīng)用非常普遍桐腌。在實(shí)際應(yīng)用中躬审,大部分?jǐn)?shù)據(jù)的記錄和日志的處理都需要使用時(shí)間。這里將介紹P...
    瀧汰泱閱讀 868評(píng)論 0 0
  • 時(shí)間(date time)應(yīng)該是一個(gè)精確的點(diǎn)痹愚,以便能夠進(jìn)行比較。但是如何能讓他成為一個(gè)精確的點(diǎn)呢?一般的,如果需要...
    遠(yuǎn)程板磚閱讀 1,854評(píng)論 1 8
  • 【姓名】 程小平【日期:2018.10.12】第5天 【目標(biāo)】我想要還清稠州銀行債務(wù)翅溺,財(cái)務(wù)富足。 【計(jì)劃】1.慷慨...
    lindacheng2017閱讀 60評(píng)論 0 0
  • 今天來(lái)開(kāi)封旅游,抽了三張卡代表帶著怎么的自己,兒子关噪,老公來(lái)旅游。 這一張是我:靚靚,28歲悉盆,迷惑脚翘。 愿望:高興的玩...
    李娟AINI閱讀 144評(píng)論 0 0