web-dev-qa-db-ja.com

C#でUNIXのタイムスタンプを取得する方法

私はstackoverflowを見てきました、そしていくつかの提案された質問を見ても答えられないようです、C#でどのようにしてUNIXタイムスタンプを取得しますか?

314
bizzehdee

DateTime.UtcNowを使用して1970年1月1日のepoc時間を引くことで、C#のUNIXタイムスタンプを取得できます。

例えば.

Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

DateTime.Nowは、UNIXのタイムスタンプを取得したい任意のDateTimeオブジェクトに置き換えることができます。

506
bizzehdee

.NET 4.6以降、 DateTimeOffset.ToUnixTimeSeconds() があります。


これはインスタンスメソッドなので、DateTimeOffsetのインスタンスで呼び出すことが期待されています。 タイムゾーン に注意してくださいが、DateTimeの任意のインスタンスをキャストすることもできます。

現在のタイムスタンプを取得するには

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

DateTimeからタイムスタンプを取得するには:

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
373
Bob

Ticksも使えます。私はWindows Mobile用にコーディングしているので、メソッドのフルセットを持っていません。 TotalSeconds は利用できません。

long epochTicks = new DateTime(1970, 1, 1).Ticks;
long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);

または

TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;
37
Dave Hindle

これは私が使っているものです:

public long UnixTimeNow()
{
    var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
    return (long)timeSpan.TotalSeconds;
}

このメソッドは時刻をCoordinated Univeral Time(UTC)として返すことに注意してください。

24

.TotalSecondsthe value of the current System.TimeSpan structure expressed in whole fractional seconds.として定義されているため、切り捨てることは重要です。

DateTimeの拡張子はどうですか。 2番目のものは、おそらくより混乱しやすいのですが、それはプロパティ拡張が存在するまで価値があるということです。

/// <summary>
/// Converts a given DateTime into a Unix timestamp
/// </summary>
/// <param name="value">Any DateTime</param>
/// <returns>The given DateTime in Unix timestamp format</returns>
public static int ToUnixTimestamp(this DateTime value)
{
    return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}

/// <summary>
/// Gets a Unix timestamp representing the current moment
/// </summary>
/// <param name="ignored">Parameter ignored</param>
/// <returns>Now expressed as a Unix timestamp</returns>
public static int UnixTimestamp(this DateTime ignored)
{
    return (int)Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}
18
Brad

現在の時刻から1970を引くと、タイムスパンにはほとんどの場合0ミリ秒以外のフィールドがあります。何らかの理由であなたがミリ秒に興味があるなら、これを覚えておいてください。

これは私がこの問題を回避するためにしたことです。

 DateTime now = UtcNow();

 // milliseconds Not included.
 DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second); 

 TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0));

 Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes.
6
Kelly Anderson

これが私が使っているものです。

 public class TimeStamp
    {
        public Int32 UnixTimeStampUTC()
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
}
5

この解決策は私の状況を助けました:

   public class DateHelper {
     public static double DateTimeToUnixTimestamp(DateTime dateTime)
              {
                    return (TimeZoneInfo.ConvertTimeToUtc(dateTime) -
                             new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
              }
    }

コードでヘルパーを使う:

double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)
2

私はこの実用的な方法への最も洗練されたアプローチをつなぎ合わせました:

public static class Ux {
    public static decimal ToUnixTimestampSecs(this DateTime date) => ToUnixTimestampTicks(date) / (decimal) TimeSpan.TicksPerSecond;
    public static long ToUnixTimestampTicks(this DateTime date) => date.ToUniversalTime().Ticks - UnixEpochTicks;
    private static readonly long UnixEpochTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
}
2
XDS

私が使用している簡単なコード:

public static long CurrentTimestamp()
{
   return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
}

このコードは、Unixタイムスタンプ、1970-01-01から現在までの合計ミリ秒を示しています。

0
Erkin Eren