biz*_*dee 359 c# timestamp unix-timestamp
我已经浏览过stackoverflow,甚至看了一些建议的问题,似乎没有人回答,你如何在C#中获得unix时间戳?
biz*_*dee 554
通过使用DateTime.UtcNow并减去1970-01-01的epoc时间,您可以在C#中获得unix时间戳.
例如
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
Run Code Online (Sandbox Code Playgroud)
DateTime.UtcNow
可以替换为DateTime.UtcNow
您想要获取unix时间戳的任何对象.
Bob*_*Bob 487
从.NET 4.6开始,就有了DateTimeOffset.ToUnixTimeSeconds()
.
这是一个实例方法,因此您需要在实例上调用它DateTimeOffset
.您也可以投射任何实例DateTime
,但要注意时区.
要获取当前时间戳:
DateTimeOffset.UtcNow.ToUnixTimeSeconds()
Run Code Online (Sandbox Code Playgroud)
要从以下位置获取时间戳DateTime
:
DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
Run Code Online (Sandbox Code Playgroud)
小智 37
你也可以使用Ticks.我正在为Windows Mobile编码,所以没有完整的方法.我无法使用TotalSeconds.
long epochTicks = new DateTime(1970, 1, 1).Ticks;
long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);
Run Code Online (Sandbox Code Playgroud)
要么
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;
Run Code Online (Sandbox Code Playgroud)
Lea*_*dro 34
使用.NET 6.0,并使用long
以避免该2038
问题:
从 DateTime.UtcNow 到 UnixTime
long seconds = (long)DateTime.UtcNow.Subtract(DateTime.UnixEpoch).TotalSeconds;
Run Code Online (Sandbox Code Playgroud)
seconds
将包含自 01/01/1970 (UnixTime) 以来的秒数
从 UnixTime 到 DateTime.UtcNow
DateTime timestamp = DateTime.UnixEpoch.AddSeconds(seconds);
Run Code Online (Sandbox Code Playgroud)
小提琴: https: //dotnetfiddle.net/xNhO6q
Bar*_*cha 25
这是我使用的:
public long UnixTimeNow()
{
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
return (long)timeSpan.TotalSeconds;
}
Run Code Online (Sandbox Code Playgroud)
请记住,此方法将返回协调通用时间(UTC)的时间.
Bra*_*rad 19
截断.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);
}
Run Code Online (Sandbox Code Playgroud)
小智 8
从 Brad 更新了一些代码:您不需要 Math.truncate,转换为 int 或 long 会自动截断值。在我的版本中,我使用 long 而不是 int(我们将在 2038 年用完 32 位有符号整数)。此外,添加了时间戳解析。
public static class DateTimeHelper
{
/// <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 long ToUnixTimestamp(this DateTime value)
{
return (long)(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 long UnixTimestamp(this DateTime ignored)
{
return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
/// <summary>
/// Returns a local DateTime based on provided unix timestamp
/// </summary>
/// <param name="timestamp">Unix/posix timestamp</param>
/// <returns>Local datetime</returns>
public static DateTime ParseUnixTimestamp(long timestamp)
{
return (new DateTime(1970, 1, 1)).AddSeconds(timestamp).ToLocalTime();
}
}
Run Code Online (Sandbox Code Playgroud)
从当前时间减去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.
Run Code Online (Sandbox Code Playgroud)
小智 5
这就是我使用的.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
下面是一个 2 路扩展类,支持:
在OP的例子中,用法是:
DateTime.Now.ToUnixtime();
Run Code Online (Sandbox Code Playgroud)
或者
DateTime.UtcNow.ToUnixtime();
Run Code Online (Sandbox Code Playgroud)
尽管存在直接答案,但我相信使用通用方法更好。特别是因为它很可能是一个需要这样转换的项目,无论如何也需要这些扩展,所以最好对所有人使用相同的工具。
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)