C#でタイムスタンプを作成する関数


101

私は疑問に思っていました、日時からc#でタイムスタンプを作成する方法はありますか?Compact Frameworkでも機能するミリ秒の精度値が必要です(DateTime.ToBinary()がCFに存在しないため)。

私の問題は、この値をデータベースにとらわれない方法で保存したいので、後で並べ替えて、他の値よりも大きい値を見つけることができます。


2
ここでの受け入れ答えは素敵なソリューションを提供していますが、実際のタイムスタンプをしたい場合は、このQ / Aをチェックアウト: stackoverflow.com/questions/9814060/...
inanutshellus

回答:


206

私はいつも次のようなものを使います:

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

これにより、200905211035131468のような文字列が得られます。これは、文字列がタイムスタンプの最上位ビットから最下位ビットに変わるため、SQLクエリの単純な文字列並べ替えを使用して、データベースの値を固定している場合に日付順に並べ替えることができます。


5
21か月で12か月しか手に入らないのはなぜですか?:)
PaulB 2009年

2
年のトークンはここでは小文字である必要があります:return value.ToString( "yyyyMMddHHmmssffff");
ドン・コート

1
@RobV質問はミリ秒の精度を要求するため、最後に3つの「f」が必要です。4つの「f」で100マイクロセンドの精度が得られます。
Eugene Beresovsky 14

2
Compact Frameworkはミリ秒を転送しないことに注意してください。それらは常に0になります。コードを変更して、次のようなものを追加する必要があります。int tick = Environment.TickCount%1000; int ms =(tick> = MOffset)?(ティック-MOffset):(1000-(MOffset-ティック)); ms = Math.Min(999、Math.Max(0、ms));
Redwolf

43

以下を使用して、秒単位で正確なUNIXスタイルの日付スタンプを作成できると思います

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

分母を調整すると、精度のレベルを選択できます


19

DateTime.Ticksプロパティを使用することもできます。これは、長く、ユニバーサルに保存可能で、コンパクトフレームワークでも常に増加して使用可能です。9999年12月31日以降はコードが使用されないことを確認してください;)


「常に増加している」と言った場合、DateTime.UtcNow.Ticksへの2回の呼び出しで異なる値が得られる保証はありませんが、ありますか?つまり、一意のタイムスタンプとして使用する前に、まだ注意が必要です。
Jon Skeet、

9
@Konstantinos:タイムスタンプを使用する場合、重複を避けることはできません。タイムスタンプは一意のキーではなく、時間をマークするために使用されます。あなたはミリ秒の精度が必要だと言っていました、そしてティックには100nsの精度があります。事はあなたが重複を持っているということです。DBに固有のシーケンスが必要ない場合は、残念ながらdbに依存しません。
Frans Bouma、

3
「時間とともに増加する実際のティック数です」。しかし、システムクロックが逆方向に移動する可能性があります。たとえば、現地時間を使用している場合、またはシステムクロックが調整されたために、夏時間の終了時などです。
ジョー

1
@フラン:絶対に。私がコメントしたのは、人々が選択したソリューションの影響について考えるべきだからです。たとえば、少なくとも夏時間の問題を解消するために、現地時間ではなくUTCを使用します。
ジョー

1
@konstantinos:うーん...ドキュメントはそれが100nsの精度を持っていると言っているので、文書化されているほど正確ではないのは奇妙です。おそらく、それは確かにコンパクトなフレームワークであり、バグのないフレームワークではありません
Frans Bouma、


4

秒単位のタイムスタンプが必要な場合は、以下を使用できます。

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;

2

実際のリアルタイムに対応するタイムスタンプが必要な場合は、それらも(特定のアプリケーションインスタンスに対して)一意にする必要がある場合は、次のコードを使用できます。

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

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