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


回答:


597

DateTime.UtcNow1970-01-01のエポック時間を使用および減算することにより、C#でUNIXタイムスタンプを取得します。

例えば

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

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

そこ分野でもあり、DateTime.UnixEpochされ、非常に悪い文書化 MSFTによっては、しかしを代替することもnew DateTime(1970, 1, 1)


28
@wdhoughに代わってコメントします。「この回答には、Int32の制限である2,147,483,647の制限があります。onlineconversion.com/ unix_time.htmによると、これは2038年1月19日03:14:07 GMTの時間に相当します。代替の数値タイプを推測します、double、longなども最終的には制限がありますが、言及する価値があると思いました。整数が必要だったので、ここで長く選択します。これが役に立て
ば幸い

11
UNIXタイムスタンプは、伝統的に32ビット整数であり、範囲は '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTCです。
the_nuts 2014

89
UNIXの時刻変換がDateTimeの一部として標準ライブラリに含まれていないことに夢中です。
xingyu 2015年

7
または整数演算を使用:DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
アントンペトロフ

2
減算された日時はUTCである必要はありませんか?
jjxtra 2017年

573

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


これはインスタンスメソッドであるため、のインスタンスで呼び出す必要がありますDateTimeOffsetタイムゾーンに注意しDateTimeながら、のインスタンスをキャストすることもできます。

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

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

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

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

126
良い。その程度の時間
bizzehdee

35
@MattBorjaありがたいことに、それが返されますInt64-ロールオーバーするまでに、地球が不足しているために地球を何年も使用していません。
Bob

24
不思議に思っている人は誰でも、現在のタイムスタンプをDateTimeOffset.Now.ToUnixTimeSeconds()
kR105

8
@ bizzehdee、Punは意図した?
st0le

5
UTC unixtimestampを取得するには、DateTimeOffset.UtcNow.ToUnixTimeSeconds()
Yair Levi

39

ティックを使用することもできます。私は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;

1
2番目のソリューションのエラー:ソースタイプ「double」をターゲットタイプ「long」に変換できません。
Pixar

@Pixar:2番目のサンプルは修正されました
JBert

5
new DateTime(1970, 1, 1)Kindプロパティが指定されていない時間を作成します。new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)本当に正しいものにしたいもの
分離された2017

.NET Core 2.1以降新しいDateTime(1970、1、1
Jaa H

27

これは私が使用するものです:

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

このメソッドは時刻を協定世界時(UTC)として返すことに注意してください。


(TotalSecondsにはdouble型があります。これをlongにキャストすると、精度が失われます。)
フランキー

あなたの右が、我々は数千年のためにそれを心配する必要はありません:)
パルトロミエミュシャ

21

切り捨て.TotalSecondsは次のように定義されているため重要ですthe 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);
}

2
拡張メソッドは明らかにこれをきれいに行う方法です。これは優れた成熟した答えです。なぜ投票数が少ないのかわかりません。Robbaが正しいことを確認してください。出力を(int)にキャストすると、自動的に結果が切り捨てられます。(文字列のdoubleの小数部分は無視されます)。
ステファニー

4
(このDateTimeは無視されます)は非常に誤解を招く可能性があります
Lars Corneliussen

6

現在の時刻から1970を減算するときは、タイムスパンにゼロ以外のミリ秒フィールドが含まれることが多いことに注意してください。何らかの理由でミリ秒に関心がある場合は、これを覚えておいてください。

この問題を回避するために私がやったことは次のとおりです。

 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.

5

これは私が使用するものです。

 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;
        }
}

多分それをDateTimeの拡張メソッドにします
bizzehdee

3

このユーティリティメソッドへの最もエレガントなアプローチをつなぎ合わせました。

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

この解決策は私の状況で役に立ちました:

   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)

0

システムのDateTimeOffsetにToUnixTimeMillisecondsがあります

あなたはDateTimeのために同様のメソッドを書くことができます:

public static long ToUnixTimeSeconds(this DateTime value)
{
    return value.Ticks / 10000000L - 62135596800L;
}

10000000L-ティックを秒に変換

62135596800L-01.01.01を01.01.1978に変換

Utcとリークに問題はありません。



0

以下は、以下をサポートする双方向拡張クラスです。

  • タイムゾーンのローカライズ
  • 秒またはミリ秒単位の入出力。

OPの場合、使用法は次のとおりです。

DateTime.Now.ToUnixtime();

または

DateTime.UtcNow.ToUnixtime();

直接的な答えはありますが、一般的なアプローチを使用する方が良いと思います。特に、このような変換が必要なプロジェクトである可能性が高いため、とにかくこれらの拡張機能も必要になるため、すべての人に同じツールを使用することをお勧めします。

    public static class UnixtimeExtensions
    {
        public static readonly DateTime UNIXTIME_ZERO_POINT = new DateTime(1970, 1, 1, 0, 0,0, DateTimeKind.Utc);

        /// <summary>
        /// Converts a Unix timestamp (UTC timezone by definition) into a DateTime object
        /// </summary>
        /// <param name="value">An input of Unix timestamp in seconds or milliseconds format</param>
        /// <param name="localize">should output be localized or remain in UTC timezone?</param>
        /// <param name="isInMilliseconds">Is input in milliseconds or seconds?</param>
        /// <returns></returns>
        public static DateTime FromUnixtime(this long value, bool localize = false, bool isInMilliseconds = true)
        {
            DateTime result;

            if (isInMilliseconds)
            {
                result = UNIXTIME_ZERO_POINT.AddMilliseconds(value);
            }
            else
            {
                result = UNIXTIME_ZERO_POINT.AddSeconds(value);
            }

            if (localize)
                return result.ToLocalTime();
            else
                return result;
        }

        /// <summary>
        /// Converts a DateTime object into a Unix time stamp
        /// </summary>
        /// <param name="value">any DateTime object as input</param>
        /// <param name="isInMilliseconds">Should output be in milliseconds or seconds?</param>
        /// <returns></returns>
        public static long ToUnixtime(this DateTime value, bool isInMilliseconds = true)
        {
            if (isInMilliseconds)
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalMilliseconds;
            }
            else
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalSeconds;
            }
        }
    }

ミリ秒と秒の形式を混同しないように注意してください(最良のケースは例外で、最悪の場合は非論理的な変換です)入出力のデフォルトをミリ秒形式に設定しました。秒形式をデフォルトとして使用する場合は、isInMilliseconds = trueを(両方のメソッドで)falseに切り替えます。
SingleFlake

0

私はしばらく苦労してこれを使用しました、それはタイムゾーンオフセットにも対応しています:

    public double Convert_DatTime_To_UNIXDATETIME(DateTime dt)
    {
        System.DateTime from_date = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
        double unix_time_since = dt.Subtract(from_date).TotalMilliseconds;

        TimeSpan ts_offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

        double offset = ts_offset.TotalMilliseconds;

        return unix_time_since - offset;
    }

-1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.