1970年以降のミリ秒単位の時間表現に変換する必要があるSQLサーバーのタイムスタンプがあります。これをプレーンSQLで実行できますか?そうでない場合は、DateTime
C#の変数に抽出しました。これのミリ秒表現を取得することは可能ですか?
ありがとう、
テジャ。
1970年以降のミリ秒単位の時間表現に変換する必要があるSQLサーバーのタイムスタンプがあります。これをプレーンSQLで実行できますか?そうでない場合は、DateTime
C#の変数に抽出しました。これのミリ秒表現を取得することは可能ですか?
ありがとう、
テジャ。
回答:
おそらく、UTCであるUNIXライクなタイムスタンプに変換しようとしています。
yourDateTime.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds
UTCには夏季の問題がないため、これにより夏季の問題も回避されます。
DateTime
そしてTimeSpan
全体ミリ秒よりも高い精度でその値を格納します。0.79ミリ秒= 7900ティック。整数が必要な場合は、を使用できますlong ms = myTimeSpan.TotalTicks / 10000;
。
DateTime.UnixEpoch
では、日付を宣言する代わりに使用できます。
DateTime
の契約のメモを見てくださいToUniversalTime
)が現地時間にあると想定していますが、そうではありませんでした。たとえば、時間をサンプリングするのが一般的であるDateTime.UtcNow
か、別のタイムゾーンにある可能性があります。
C#では、次のように書くことができます
(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
long
代わりにキャストすることをお勧めしint
ます
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);
逆に行きたい場合。
AddMilliseconds()
タイプのパラメータが必要ですdouble
。暗黙の変換がそれを処理しますが、注目に値するかもしれません。
int.MaxValue
ミリ秒単位で約25日です。それが役に立たない可能性があります。
.NET 4.6以降、DateTimeOffset
オブジェクトを使用してUNIXミリ秒を取得できます。DateTime
オブジェクトを受け取るコンストラクターがあるので、以下に示すようにオブジェクトを渡すことができます。
DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();
他の回答に記載されているようyourDateTime
に、正しくKind
指定されていることを確認するか、.ToUniversalTime()
最初にUTC時間に変換するために使用してください。
ここでは、について詳しく知ることができますDateTimeOffset
。
.Now
はこの質問に直接適用されません。
SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000
これでは完全な精度は得られませんがDATEDIFF(MS...
、オーバーフローが発生します。秒で十分であれば、これで十分です。
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;
}
安藤の答えを使って、これが私がやっていることです
このような構造体またはクラスを作成できます
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);
これがお役に立てば幸いです
(now - Epoch).TotalMilliseconds
、ここでnow
、Epoch
はDateTimeオブジェクトです。