ミリ秒単位のDateTimeの表現?


81

1970年以降のミリ秒単位の時間表現に変換する必要があるSQLサーバーのタイムスタンプがあります。これをプレーンSQLで実行できますか?そうでない場合は、DateTimeC#の変数に抽出しました。これのミリ秒表現を取得することは可能ですか?

ありがとう、
テジャ。


1
後者の質問の場合:(now - Epoch).TotalMilliseconds、ここでnowEpochはDateTimeオブジェクトです。

回答:


144

おそらく、UTCであるUNIXライクなタイムスタンプに変換しようとしています。

yourDateTime.ToUniversalTime().Subtract(
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    ).TotalMilliseconds

UTCには夏季の問題がないため、これにより夏季の問題も回避されます。


2
これにより、出力として分数が得られます。たとえば、「1552678714362.79」「。79」はどこから来ていますか?
SharifYazdian19年

2
@SharifYazdianそれはまさにあなたが期待するものであり、0.79ミリ秒です。システム時間はティックで測定されます。1ミリ秒は10000ティックを持っていることを考えると、DateTimeそしてTimeSpan全体ミリ秒よりも高い精度でその値を格納します。0.79ミリ秒= 79​​00ティック。整数が必要な場合は、を使用できますlong ms = myTimeSpan.TotalTicks / 10000;
LWChris

2
.NET Core(> 2.1)DateTime.UnixEpochでは、日付を宣言する代わりに使用できます。
トム

1
このコードには問題があります:(DateTimeの契約のメモを見てくださいToUniversalTime)が現地時間にあると想定していますが、そうではありませんでした。たとえば、時間をサンプリングするのが一般的であるDateTime.UtcNowか、別のタイムゾーンにある可能性があります。
ceztko

70

C#では、次のように書くことができます

(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds

15
:)のlong代わりにキャストすることをお勧めしintます
Jon Skeet

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);逆に行きたい場合。
JackMorrissey 2016

@JackMorrissey:AddMilliseconds()タイプのパラメータが必要ですdouble。暗黙の変換がそれを処理しますが、注目に値するかもしれません。
アクセルケンパー2016年

@JonSkeetなぜintではなくlongにキャストすることを提案するのですか?:)
Roxy'Pro

4
@ Roxy'Pro:int.MaxValueミリ秒単位で約25日です。それが役に立たない可能性があります。
ジョンスキート

35

.NET 4.6以降、DateTimeOffsetオブジェクトを使用してUNIXミリ秒を取得できます。DateTimeオブジェクトを受け取るコンストラクターがあるので、以下に示すようにオブジェクトを渡すことができます。

DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();

他の回答に記載されているようyourDateTimeに、正しくKind指定されていることを確認するか、.ToUniversalTime()最初にUTC時間に変換するために使用してください。

ここでは、について詳しく知ることができますDateTimeOffset


1
ToUnixTimeMilliseconds()は、実際には.Net3.5には存在しません。
NickLokarno 2017年

2
MSDNによるとToUnixTimeMilliseconds()、.NET 4.6
NM

1
@kayleeFrye_onDeck OPはデータベースから取得したタイムスタンプについて質問しているため、コメント.Nowはこの質問に直接適用されません。
ボブ

2
SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000

これでは完全な精度は得られませんがDATEDIFF(MS...、オーバーフローが発生します。秒で十分であれば、これで十分です。


2

unixtimestampmillis C#への秘密の日時のためのこの他のソリューション。

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static long GetCurrentUnixTimestampMillis()
{
    DateTime localDateTime, univDateTime;
    localDateTime = DateTime.Now;          
    univDateTime = localDateTime.ToUniversalTime();
    return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
} 

1

安藤の答えを使って、これが私がやっていることです

このような構造体またはクラスを作成できます

struct Date
    {
        public static double GetTime(DateTime dateTime)
        {
            return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
        }

        public static DateTime DateTimeParse(double milliseconds)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime();
        }

    }

そして、あなたは次のようにあなたのコードでこれを使うことができます

DateTime dateTime = DateTime.Now;

double total = Date.GetTime(dateTime);

dateTime = Date.DateTimeParse(total);

これがお役に立てば幸いです


1

DateTimeExtensionsクラスにはメソッドがToUnixTime()ありToUnixTimeMs()ます

DateTime.UtcNow.ToUnixTimeMs()

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