Linuxエポック(1970年1月1日深夜からの秒数)で現在のタイムスタンプを取得するためのサンプルコードを見つけることができましたが、エポックが将来どうなるかを計算する方法の例を見つけるのに苦労しています。たとえば、10今から数分後、Linuxエポックで将来の時間を計算するにはどうすればよいですか?
4 に答える
この拡張メソッドは次の役割を果たします。
private static double GetUnixEpoch(this DateTime dateTime)
{
var unixTime = dateTime.ToUniversalTime() -
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return unixTime.TotalSeconds;
}
そして、あなたはそれをそのように使うことができます:
var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now
var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future
Unixエポックの開始が定義される方法であるため、 UTC(協定世界時)ですべての日時を処理する必要があることに注意してください。
Windowsシステムの.NetでのUnixエポック時間を知りたい場合は、興味深い工夫があります。
ほぼすべての実際的なケースで、現在の時刻がUnixエポックを過ぎていると仮定すると、実際に取ることができます
System.TimeSpan timeDifference = DateTime.UTCNow -
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long unixEpochTime = System.Convert.ToInt64(timeDifference.TotalSeconds);
だが、
Unixエポック時間は、「...うるう秒を数えずに、1970年1月1日の協定世界時(UTC)の真夜中から経過した秒数として定義される時点を記述するためのシステム」として定義されます。(1)
1972年以来、UTCには「うるう秒」が含まれており、これまでに合計25秒が含まれています。(2)
.Net DateTimeにはうるう秒の規定はありませんが、OS時間に依存するだけです。Windowsはうるう秒(3)(4)を幸いにも認識していないため、NTPマスターからうるう秒を受信するときに時間の概念があります(ドメインに接続されていないマシンのデフォルトはtime.windows.comだと思います)。 、うるう秒を含むUTCを提供している可能性があります。
これは、Unixエポックから経過した実際の秒数を正確に把握するには、これに依存するアプリケーションの上記の結果にうるう秒を追加する必要があることを意味します。うるう秒はかなり前に発表されていないため、毎回追加する秒数を追跡する必要があります(2)。ただし、Unixエポック時間の定義ではうるう秒が明示的に除外されているため、これを無視して、現在のUTC時刻から秒を再計算するだけで済みます。
うるう秒がソフトウェアの混乱を引き起こす場合があります(5)。慣行を維持するか排除するかについての議論は進行中です(6)(7)(8)。
回答時の最後のうるう秒は2012年7月1日に発生し(9)、さまざまなサイトやアプリケーションに問題を引き起こしました(10)
(1)http://en.wikipedia.org/wiki/Unix_time
(2)http://en.wikipedia.org/wiki/Leap_second
(3)http://support.microsoft.com/kb/909614
(4)http://www.meinberg.de/english/info/leap-second.htm
(5)http://www.networkworld.com/news/2009/010609-leap-second-snafu-affects-oracle.html
(6)http://www.pcworld.idg.com.au/article/358024/time_waits_no_one_leap_seconds_may_cut/
(7)http://queue.acm.org/detail.cfm?id=1967009
(8)http://arxiv.org/abs/1106.3141
(9)http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat
(10)http://arstechnica.com/business/2012/07/one-day-later-the-leap-second-v-the-internet-scorecard/
(元の回答には間違いがありましたが、以下のコメント投稿者のエドワードブレイとモルメギルがありがたいことにそれを見つけました)
基本的な解決策:
- 現在の時間をとる
- 未来へのオフセットの追加(あなたの例では10分)
- 1970年1月1日の真夜中を引く
- 2つの間の合計秒数を取得します
C#の場合(頭のてっぺんから、テストされていません):
DateTime myEpoch = DateTime.Now.Add( new TimeSpan(...) );
return myEpoch.Subtract( new DateTime(1970, 1, 1, 0, 0, 0) ).TotalSeconds;
現在の時刻を取得するために使用する関数は何ですか?
確かに.NETDateTimeパラメータを取ります...
確かに、それは将来のDateTimeを関数に渡すという単純な問題です。
または、現在の時刻と将来の時刻の間の秒単位でDateDiffを実行し、それを追加します。
var dt = new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime();
var now = System.DateTime.Now.ToUniversalTime();
var future = new DateTime(2010, 1, 1).ToUniversalTime();
Console.WriteLine((now - dt).TotalSeconds);
Console.WriteLine((future - dt).TotalSeconds);