[英]Create a string from c++11 time_t that is convertable to .net DateTime
[英].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; }
我真的害怕我在這里弄錯了。 請檢查這個解決方案! (檢查這是否正確)
謝謝
嘗試
(dt - new DateTime (1970, 1, 1)).TotalSeconds
看到
這看起來有點整潔? 如果您將大量使用它,您可以使紀元成為靜態日期時間。
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.