ฉันได้ดู stackoverflow แล้วและยังดูคำถามที่แนะนำบางคำถามและดูเหมือนไม่มีคำตอบคุณจะได้รับ unix timestamp ใน C # ได้อย่างไร
ฉันได้ดู stackoverflow แล้วและยังดูคำถามที่แนะนำบางคำถามและดูเหมือนไม่มีคำตอบคุณจะได้รับ unix timestamp ใน C # ได้อย่างไร
คำตอบ:
คุณจะได้รับการประทับเวลา unix ใน C # โดยการใช้DateTime.UtcNow
และลบเวลาของยุค 1970-01-01
เช่น
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
DateTime.UtcNow
สามารถถูกแทนที่ด้วยDateTime
วัตถุใด ๆที่คุณต้องการรับการประทับเวลา unix สำหรับ
นอกจากนี้ยังมีฟิลด์DateTime.UnixEpoch
ซึ่งMSFT มีเอกสารไม่ดีมากแต่อาจใช้แทนได้new DateTime(1970, 1, 1)
DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
ในฐานะของ .NET 4.6 DateTimeOffset.ToUnixTimeSeconds()
มี
DateTimeOffset
นี่คือวิธีการเช่นเพื่อให้คุณคาดว่าจะเรียกมันว่าในตัวอย่างของ คุณยังสามารถส่งตัวอย่างของการใด ๆDateTime
แต่ระวังเขตเวลา
วิธีรับเวลาประทับปัจจุบัน:
DateTimeOffset.UtcNow.ToUnixTimeSeconds()
วิธีรับการประทับเวลาจากDateTime
:
DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
Int64
- ตามเวลาที่ผ่านไปเราจะไม่ใช้โลกเป็นเวลาหลายปีอีกต่อไปสำหรับการขาดโลก
DateTimeOffset.Now.ToUnixTimeSeconds()
คุณยังสามารถใช้เห็บ ฉันกำลังเขียนโค้ดสำหรับ Windows Mobile จึงไม่มีวิธีการเต็มรูปแบบ TotalSecondsไม่สามารถใช้ได้สำหรับฉัน
long epochTicks = new DateTime(1970, 1, 1).Ticks;
long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);
หรือ
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;
new DateTime(1970, 1, 1)
สร้างเวลาด้วยKind
คุณสมบัติที่ไม่ระบุ สิ่งที่คุณต้องการnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
จะแก้ไขให้ถูกต้องจริง ๆ
นี่คือสิ่งที่ฉันใช้:
public long UnixTimeNow()
{
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
return (long)timeSpan.TotalSeconds;
}
โปรดทราบว่าวิธีนี้จะส่งคืนเวลาเป็น Coordinated Univeral Time (UTC)
double
ประเภทหล่อมันยาวจะทำให้เกิดการสูญเสียของความแม่นยำ.)
การตัดทอน.TotalSeconds
มีความสำคัญเนื่องจากถูกกำหนดให้เป็นthe value of the current System.TimeSpan structure expressed in whole fractional seconds.
และวิธีการเกี่ยวกับการขยายDateTime
หรือไม่ ส่วนที่สองอาจสร้างความสับสนมากกว่าว่ามีค่าจนกว่าส่วนขยายคุณสมบัติจะมีอยู่
/// <summary>
/// Converts a given DateTime into a Unix timestamp
/// </summary>
/// <param name="value">Any DateTime</param>
/// <returns>The given DateTime in Unix timestamp format</returns>
public static int ToUnixTimestamp(this DateTime value)
{
return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}
/// <summary>
/// Gets a Unix timestamp representing the current moment
/// </summary>
/// <param name="ignored">Parameter ignored</param>
/// <returns>Now expressed as a Unix timestamp</returns>
public static int UnixTimestamp(this DateTime ignored)
{
return (int)Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}
เมื่อคุณลบ 1970 จากเวลาปัจจุบันโปรดทราบว่าช่วงเวลาที่มักจะมีฟิลด์ที่ไม่ใช่ศูนย์มิลลิวินาที หากคุณมีความสนใจในมิลลิวินาทีด้วยเหตุผลบางประการ
นี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้
DateTime now = UtcNow();
// milliseconds Not included.
DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second);
TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0));
Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes.
นี่คือสิ่งที่ฉันใช้
public class TimeStamp
{
public Int32 UnixTimeStampUTC()
{
Int32 unixTimeStamp;
DateTime currentTime = DateTime.Now;
DateTime zuluTime = currentTime.ToUniversalTime();
DateTime unixEpoch = new DateTime(1970, 1, 1);
unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
return unixTimeStamp;
}
}
ฉันเชื่อมต่อกันด้วยวิธีที่สวยงามที่สุดในวิธีการยูทิลิตี้นี้:
public static class Ux {
public static decimal ToUnixTimestampSecs(this DateTime date) => ToUnixTimestampTicks(date) / (decimal) TimeSpan.TicksPerSecond;
public static long ToUnixTimestampTicks(this DateTime date) => date.ToUniversalTime().Ticks - UnixEpochTicks;
private static readonly long UnixEpochTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
}
โซลูชันนี้ช่วยในสถานการณ์ของฉัน:
public class DateHelper {
public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
return (TimeZoneInfo.ConvertTimeToUtc(dateTime) -
new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
}
}
ใช้ผู้ช่วยในรหัส:
double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)
มี ToUnixTimeMilliseconds สำหรับ DateTimeOffset ในระบบ
คุณสามารถเขียนวิธีที่คล้ายกันสำหรับ DateTime:
public static long ToUnixTimeSeconds(this DateTime value)
{
return value.Ticks / 10000000L - 62135596800L;
}
10,000000L - การแปลงเห็บเป็นวินาที
62135596800L - แปลง 01.01.01 ถึง 01.01.1978
ไม่มีปัญหากับ Utc และการรั่วไหล
ด้านล่างเป็นคลาสส่วนขยายแบบ 2 ทิศทางที่รองรับ:
ในกรณีของ OP การใช้งานคือ:
DateTime.Now.ToUnixtime();
หรือ
DateTime.UtcNow.ToUnixtime();
แม้ว่าจะมีคำตอบโดยตรง แต่ฉันเชื่อว่าการใช้วิธีการทั่วไปนั้นดีกว่า โดยเฉพาะอย่างยิ่งเนื่องจากเป็นไปได้ว่าโครงการที่ต้องการการแปลงเช่นนี้จะต้องมีส่วนขยายเหล่านี้ด้วยดังนั้นจึงควรใช้เครื่องมือเดียวกันสำหรับทุกคน
public static class UnixtimeExtensions
{
public static readonly DateTime UNIXTIME_ZERO_POINT = new DateTime(1970, 1, 1, 0, 0,0, DateTimeKind.Utc);
/// <summary>
/// Converts a Unix timestamp (UTC timezone by definition) into a DateTime object
/// </summary>
/// <param name="value">An input of Unix timestamp in seconds or milliseconds format</param>
/// <param name="localize">should output be localized or remain in UTC timezone?</param>
/// <param name="isInMilliseconds">Is input in milliseconds or seconds?</param>
/// <returns></returns>
public static DateTime FromUnixtime(this long value, bool localize = false, bool isInMilliseconds = true)
{
DateTime result;
if (isInMilliseconds)
{
result = UNIXTIME_ZERO_POINT.AddMilliseconds(value);
}
else
{
result = UNIXTIME_ZERO_POINT.AddSeconds(value);
}
if (localize)
return result.ToLocalTime();
else
return result;
}
/// <summary>
/// Converts a DateTime object into a Unix time stamp
/// </summary>
/// <param name="value">any DateTime object as input</param>
/// <param name="isInMilliseconds">Should output be in milliseconds or seconds?</param>
/// <returns></returns>
public static long ToUnixtime(this DateTime value, bool isInMilliseconds = true)
{
if (isInMilliseconds)
{
return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalMilliseconds;
}
else
{
return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalSeconds;
}
}
}
ฉันใช้สิ่งนี้หลังจากดิ้นรนไประยะหนึ่งแล้วมันก็สำคัญกับเขตเวลาชดเชยเช่นกัน:
public double Convert_DatTime_To_UNIXDATETIME(DateTime dt)
{
System.DateTime from_date = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
double unix_time_since = dt.Subtract(from_date).TotalMilliseconds;
TimeSpan ts_offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);
double offset = ts_offset.TotalMilliseconds;
return unix_time_since - offset;
}
รหัสง่าย ๆ ที่ฉันใช้:
public static long CurrentTimestamp()
{
return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
}
รหัสนี้จะให้การประทับเวลายูนิกซ์รวมเป็นมิลลิวินาทีจาก1970-01-01ถึงตอนนี้