簡體   English   中英

.NET DateTime到time_t,以秒為單位

[英].NET DateTime to time_t in seconds

有C代碼:

time1=((double)dt1-25569.0)*86400.0;

它在幾秒鍾內從TDateTime(VCL)轉換為time_t格式,所以最后我需要從.NET DateTime獲取time_t格式

關於time_t:

幾乎普遍預期它是一個整數值,表示自UTC時間1970年1月1日00:00起經過的秒數。 這是由於歷史原因,因為它對應於unix時間戳,但是在所有平台的C庫中廣泛實現。

所以要在.NET中獲得秒數,我正在做這個(F#):

let seconds(dt : DateTime) =
    (dt.Ticks/10000000L)

或者在C#上(使用更流行的C#標簽):

Int64 seonds(DateTime dt)
{ return (dt.Ticks/ ((Int64)10000000)); } 
// hope it works, but please correct if I mistaken

據我所知,它是從0001 UTC 1月1日12:00:00開始的時間。

所以要使用time_t格式,我需要在幾秒鍾內添加1970年。

所以最終函數必須是(F#):

let seconds(dt : DateTime) =
    (dt.Ticks/10000000L) + 31536000*1970

C# :

Int64 seonds(DateTime dt)
{ return (dt.Ticks/ ((Int64)10000000)) + 31536000*1970; } 

我真的害怕我在這里弄錯了。 請檢查這個解決方案! (檢查這是否正確)

謝謝

這看起來有點整潔? 如果您將大量使用它,您可以使紀元成為靜態日期時間。

DateTime date = DateTime.Now;
DateTime epoch = new DateTime(1970, 1, 1);
TimeSpan span = (date - epoch);
double unixTime = span.TotalSeconds;

我建議使用以下代碼。 它似乎更好地傳達了代碼的含義

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

Int64 seconds(DateTime dt)
{
  return (dt - REFERENCE).TotalSeconds;
}

在C#中:

Int64 Secs(DateTime dt)
{
    var delta = dt - new DateTime(1970, 1, 1);
    return Convert.ToInt64(delta.TotalSeconds);
}

在閱讀@ jheriko對已接受答案的評論之后,我寫了一個快速控制台應用程序來測試msvcrt.dll中的time()是否會產生不同的結果,使用托管日期/時間函數進行計算,幸運的是, 如果使用了UTC ,它們就沒有。 一般而言,應盡可能使用UTC計算日期和時間,並將其作為公共基准存儲在UTC中,然后根據需要轉換回相關時區進行顯示。

作為參考,並說明到達1970年1月1日至今之間的秒數的不同方式,我的測試代碼是:

class Program
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern int time(int* timer);

    static unsafe void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        DateTime utc_now = DateTime.UtcNow;

        int time_t_msvcrt = time(null);
        int time_t_managed = (int)Math.Floor((now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);
        int time_t_managed_2 = (int)Math.Floor((utc_now - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);

        Console.WriteLine(time_t_msvcrt == time_t_managed);
        Console.WriteLine(time_t_msvcrt == time_t_managed_2);

        DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        DateTime time_t_now = epoch.Add(TimeSpan.FromSeconds(time_t_msvcrt));

        long now_secs = now.Ticks / 10000000L;
        long utc_now_secs = utc_now.Ticks / 10000000L;
        long time_t_now_secs = time_t_now.Ticks / 10000000L;

        Console.WriteLine(time_t_now_secs == now_secs);
        Console.WriteLine(time_t_now_secs == utc_now_secs);
        Console.ReadLine();
    }
}

這會產生輸出

True
True
True
True

正如所料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM