[C#] C #에서 유닉스 타임 스탬프를 얻는 방법

나는 stackoverflow를 둘러 보았고 제안 된 질문 중 일부를 보았지만 아무도 대답하지 않는 것 같습니다 .C #에서 유닉스 타임 스탬프를 어떻게 얻습니까?



답변

DateTime.UtcNow1970-01-01의 에포크 시간을 사용 하고 빼서 C #에서 유닉스 타임 스탬프를 얻습니다 .

예 :

Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

DateTime.UtcNowDateTime유닉스 타임 스탬프를 가져 오려는 객체 로 대체 할 수 있습니다 .

이 필드,도 DateTime.UnixEpoch되고, 매우 가난하게 문서화 MSFT에 의해,하지만를 대체 할 수있다new DateTime(1970, 1, 1)


답변

.NET 4.6부터는 DateTimeOffset.ToUnixTimeSeconds().


이것은 인스턴스 메소드이므로의 인스턴스에서 호출해야합니다 DateTimeOffset. 시간대를주의DateTime 하더라도 인스턴스를 캐스팅 할 수도 있습니다 .

현재 타임 스탬프를 얻으려면

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

에서 타임 스탬프를 얻으려면 DateTime:

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).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;


답변

이것이 내가 사용하는 것입니다 :

public long UnixTimeNow()
{
    var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
    return (long)timeSpan.TotalSeconds;
}

이 방법은 시간을 협정 세계시 (UTC)로 반환합니다.


답변

잘림 .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을 빼면 시간 범위에 0이 아닌 밀리 초 필드가있는 경우가 가장 많습니다. 어떤 이유로 든 밀리 초에 관심이 있다면 이것을 명심하십시오.

이 문제를 해결하기 위해 내가 한 일은 다음과 같습니다.

 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;
        }
}