誰もが一度は陥る日付処理。各種プログラミング言語におけるDateTime型/TimeStamp型の変換方法のまとめ – Yuta.Kikuchiの日記.
例のごとくC#が無いので勝手に追加する。VBも基本一緒だ。
ついカッとなってやったが、後悔はしていない。
.NET Frameworkで日付、時刻を扱うのはDateTime型(クラス)だ。
現在時刻の取得
当然C#なら何も悩まない。悩む必要など無い。
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"現在時刻"</span>);
<span class="hljs-keyword">var</span> _now = DateTime.<span class="hljs-built_in">Now</span>;
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, _now);
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"現在時刻"</span>);
<span class="hljs-keyword">var</span> _now = DateTime.<span class="hljs-built_in">Now</span>;
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, _now);
Console.WriteLine("現在時刻");
var _now = DateTime.Now;
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now);
現在時刻のTimeStamp取得
.Net Framewrokは当然UnixのTimeStampなんて知ったこっちゃ無いのでこれは変換が必要。
DateTime型は1970からとかケチくさいことは言わず西暦1年からのシリアル値を内部的に持つので、以下のように1970/1/1までの時刻値を求めて、現在時刻(UTC)との差分をとるように計算する。
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)/<span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)/<span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp</span>)</span>;
//現在時刻からTimeStampを取得するよ
Console.WriteLine("現在時刻をタイムスタンプにする");
//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.Parse("1970-01-01 00:00:00").Ticks)/10000000);
Console.WriteLine("TIMESTAMP = {0}", _nowTimestamp);
DateTime => TimeStamp変換
先ほどの逆になるが、秒数単位で足し込むためのメソッドが用意されているのでコードは楽な感じになる。
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTime(1970, 1, 1, 0, 0, 0)</span>;
var _now2 = unixOriginTime.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now2</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTime(1970, 1, 1, 0, 0, 0)</span>;
var _now2 = unixOriginTime.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now2</span>)</span>;
//TimeStampから時刻に戻すよ
Console.WriteLine("タイムスタンプを現在時刻に戻すよ");
var unixOriginTime = new DateTime(1970, 1, 1, 0, 0, 0);
var _now2 = unixOriginTime.AddSeconds(_nowTimestamp).ToLocalTime();
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now2);
C#でのまとめ
そもそもUnixのTimeStampとかめんどくさい。WindowsならFILETIMEかVT_DateだろJK。ま、.NETのDateTimeはそのどっちでも無いけどな。
日付の文字列変換は、このサンプルのような固定変換じゃ無くて、よい子はユーザーロケールの設定使うようにしようね。
こんな事毎回書いているのはめんどくさいので、よい子はヘルパークラスのライブラリ作って、DateTime型の拡張クラスにしましょう。
異論は認める。
全体コード:
(ご要望によりDateTimeOffsetでのコードも追加 23:26)
using System;
namespace DateTimeSample
{
<span class="hljs-keyword">class</span> Program
{
static void <span class="hljs-constructor">Main(<span class="hljs-params">string</span>[] <span class="hljs-params">args</span>)</span> {
<span class="hljs-comment">//現在時刻を取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now = DateTime.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)<span class="hljs-operator"> / </span><span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTime(1970, 1, 1, 0, 0, 0)</span>;
var _now2 = unixOriginTime.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now2</span>)</span>;
<span class="hljs-comment">//Console.Read();</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"nおまけご要望によりDateTimeOffsetを使ってみる(が、たいして変わらないよ)"</span>)</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now3 = DateTimeOffset.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp2 = (uint)((DateTimeOffset.UtcNow.Ticks - DateTimeOffset.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)<span class="hljs-operator"> / </span><span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp2</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTimeOffset(1970, 1, 1, 0, 0, 0, <span class="hljs-params">new</span> TimeSpan(0)</span>); <span class="hljs-comment">//ここだけちょっと違う感じに。UTCなのでオフセット(時差)は0</span>
var _now4 = unixOriginTime2.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now4</span>)</span>;
Console.<span class="hljs-constructor">Read()</span>;
}
}
}
using System;
namespace DateTimeSample
{
<span class="hljs-keyword">class</span> Program
{
static void <span class="hljs-constructor">Main(<span class="hljs-params">string</span>[] <span class="hljs-params">args</span>)</span> {
<span class="hljs-comment">//現在時刻を取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now = DateTime.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)<span class="hljs-operator"> / </span><span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTime(1970, 1, 1, 0, 0, 0)</span>;
var _now2 = unixOriginTime.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now2</span>)</span>;
<span class="hljs-comment">//Console.Read();</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"nおまけご要望によりDateTimeOffsetを使ってみる(が、たいして変わらないよ)"</span>)</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now3 = DateTimeOffset.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
<span class="hljs-comment">//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。</span>
uint _nowTimestamp2 = (uint)((DateTimeOffset.UtcNow.Ticks - DateTimeOffset.<span class="hljs-constructor">Parse(<span class="hljs-string">"1970-01-01 00:00:00"</span>)</span>.Ticks)<span class="hljs-operator"> / </span><span class="hljs-number">10000000</span>);
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimestamp2</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var unixOriginTime2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DateTimeOffset(1970, 1, 1, 0, 0, 0, <span class="hljs-params">new</span> TimeSpan(0)</span>); <span class="hljs-comment">//ここだけちょっと違う感じに。UTCなのでオフセット(時差)は0</span>
var _now4 = unixOriginTime2.<span class="hljs-constructor">AddSeconds(<span class="hljs-params">_nowTimestamp</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now4</span>)</span>;
Console.<span class="hljs-constructor">Read()</span>;
}
}
}
using System;
namespace DateTimeSample
{
class Program
{
static void Main(string[] args) {
//現在時刻を取得するよ
Console.WriteLine("現在時刻");
var _now = DateTime.Now;
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now);
//現在時刻からTimeStampを取得するよ
Console.WriteLine("現在時刻をタイムスタンプにする");
//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。
uint _nowTimestamp = (uint)((DateTime.UtcNow.Ticks - DateTime.Parse("1970-01-01 00:00:00").Ticks) / 10000000);
Console.WriteLine("TIMESTAMP = {0}", _nowTimestamp);
//TimeStampから時刻に戻すよ
Console.WriteLine("タイムスタンプを現在時刻に戻すよ");
var unixOriginTime = new DateTime(1970, 1, 1, 0, 0, 0);
var _now2 = unixOriginTime.AddSeconds(_nowTimestamp).ToLocalTime();
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now2);
//Console.Read();
Console.WriteLine("nおまけご要望によりDateTimeOffsetを使ってみる(が、たいして変わらないよ)");
Console.WriteLine("現在時刻");
var _now3 = DateTimeOffset.Now;
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now);
//現在時刻からTimeStampを取得するよ
Console.WriteLine("現在時刻をタイムスタンプにする");
//1970/1/1からの経過時間をTicksプロパティを使い100ns単位で計算し、秒数に変換する。
uint _nowTimestamp2 = (uint)((DateTimeOffset.UtcNow.Ticks - DateTimeOffset.Parse("1970-01-01 00:00:00").Ticks) / 10000000);
Console.WriteLine("TIMESTAMP = {0}", _nowTimestamp2);
//TimeStampから時刻に戻すよ
Console.WriteLine("タイムスタンプを現在時刻に戻すよ");
var unixOriginTime2 = new DateTimeOffset(1970, 1, 1, 0, 0, 0, new TimeSpan(0)); //ここだけちょっと違う感じに。UTCなのでオフセット(時差)は0
var _now4 = unixOriginTime2.AddSeconds(_nowTimestamp).ToLocalTime();
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now4);
Console.Read();
}
}
}
.NET Framework 4.6以降 (2015/10/14追記)
.NET Framework 4.6以降ではDateTimeOffset型にUNIX時間との変換メソッドが追加されたので、特に悩む必要は無くなっている。
- DateTimeOffset.ToUnixTimeSeconds Method ()
- DateTimeOffset.ToUnixTimeMilliseconds Method ()
- DateTimeOffset.FromUnixTimeSeconds Method (Int64)
- DateTimeOffset.FromUnixTimeMilliseconds Method (Int64)
サンプルコード:
<span class="hljs-comment">// これ以下は.NET 4.6からの方法</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"\nおまけご要望によりDateTimeOffsetを使ってみる(.NET 4.6)"</span>)</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now5 = DateTimeOffset.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
long _nowTimeStamp3 = _now5.<span class="hljs-constructor">ToUnixTimeSeconds()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimeStamp3</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var _now6 = DateTimeOffset.<span class="hljs-constructor">FromUnixTimeSeconds(<span class="hljs-params">_nowTimeStamp3</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now6</span>)</span>;
<span class="hljs-comment">// これ以下は.NET 4.6からの方法</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"\nおまけご要望によりDateTimeOffsetを使ってみる(.NET 4.6)"</span>)</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻"</span>)</span>;
var _now5 = DateTimeOffset.Now;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now</span>)</span>;
<span class="hljs-comment">//現在時刻からTimeStampを取得するよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"現在時刻をタイムスタンプにする"</span>)</span>;
long _nowTimeStamp3 = _now5.<span class="hljs-constructor">ToUnixTimeSeconds()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"TIMESTAMP = {0}"</span>, <span class="hljs-params">_nowTimeStamp3</span>)</span>;
<span class="hljs-comment">//TimeStampから時刻に戻すよ</span>
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"タイムスタンプを現在時刻に戻すよ"</span>)</span>;
var _now6 = DateTimeOffset.<span class="hljs-constructor">FromUnixTimeSeconds(<span class="hljs-params">_nowTimeStamp3</span>)</span>.<span class="hljs-constructor">ToLocalTime()</span>;
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-string">"DATETIME = {0:yyyy-MM-dd hh:mm:ss}"</span>, <span class="hljs-params">_now6</span>)</span>;
// これ以下は.NET 4.6からの方法
Console.WriteLine("\nおまけご要望によりDateTimeOffsetを使ってみる(.NET 4.6)");
Console.WriteLine("現在時刻");
var _now5 = DateTimeOffset.Now;
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now);
//現在時刻からTimeStampを取得するよ
Console.WriteLine("現在時刻をタイムスタンプにする");
long _nowTimeStamp3 = _now5.ToUnixTimeSeconds();
Console.WriteLine("TIMESTAMP = {0}", _nowTimeStamp3);
//TimeStampから時刻に戻すよ
Console.WriteLine("タイムスタンプを現在時刻に戻すよ");
var _now6 = DateTimeOffset.FromUnixTimeSeconds(_nowTimeStamp3).ToLocalTime();
Console.WriteLine("DATETIME = {0:yyyy-MM-dd hh:mm:ss}", _now6);
コメント
Tadahiro Kihara liked this on Facebook.
Yousuke Saki liked this on Facebook.
Daizen Ikehara liked this on Facebook.
Masakazu Sano liked this on Facebook.