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


답변:


597

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)


28
@wdhough를 대신하여 댓글 달기. "이 답변은 Int32의 한계 인 2,147,483,647에 한계가 있습니다. onlineconversion.com/unix_time.htm 이것은 Tue의 시간과 같습니다 2038 년 1 월 19 일 03시 14 분 7 초 , double, long 등도 궁극적으로 한계가 있지만 언급 할 가치가 있다고 생각했습니다. 정수를 원할 때 여기에서 길게 선택합니다. 도움이 되길 바랍니다. "
IsmailS

11
유닉스 타임 스탬프는 전통적으로 32 비트 정수이며, '1970-01-01 00:00:01'UTC에서 '2038-01-19 03:14:07'UTC 범위입니다.
the_nuts

89
UNIX 시간 변환이 표준 라이브러리에 DateTime의 일부가 아니라는 점에 미쳤습니다.
xingyu

7
또는 정수 산술 사용 :DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
Anton Petrov

2
빼는 날짜 시간이 UTC 일 필요는 없습니까?
jjxtra

570

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


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

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

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

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

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();

126
좋은. 그것은 시간에 관한
bizzehdee

35
@MattBorja 고맙게도, 그것은 Int64롤오버 될 때까지, 지구 부족으로 더 이상 지구 년을 사용하지 않을 것입니다.
Bob

24
궁금한 DateTimeOffset.Now.ToUnixTimeSeconds()
점이 있으시면 다음

8
@bizzehdee, Pun 의도입니까?
st0le

5
DateTimeOffset.UtcNow.ToUnixTimeSeconds ()를 사용하여 UTC unixtimestamp를 얻을 수 있습니다
Yair Levi

39

진드기를 사용할 수도 있습니다. 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;

1
두 번째 해결책에 대한 오류 : 소스 유형 'double'을 대상 유형 'long'으로 변환 할 수 없습니다.
Pixar

@Pixar : 두 번째 샘플이 수정되었습니다
JBert

5
new DateTime(1970, 1, 1)지정되지 않은 Kind속성 으로 시간을 만듭니다 . 당신이 new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)진정으로 옳고
싶어하는 것

.NET Core 2.1에서 새로운 DateTime (1970, 1, 1) 대신 DateTime.UnixEpoch를 사용할 수 있습니다. docs.microsoft.com/en-us/dotnet/api/…
Jaa H

27

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

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

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


(TotalSeconds에는 double유형이 있습니다. 오랫동안 캐스팅하면 정밀도가 떨어질 수 있습니다.)
frankish

당신은 그렇습니다, 그러나 우리는 수천 년 동안 그것에 대해 걱정할 필요가 없습니다 :)
Bartłomiej Mucha

21

잘림 .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);
}

2
확장 방법은 분명히 깔끔하게 수행하는 방법입니다. 이것은 훌륭하고 성숙한 답변이며 왜 투표가 적은지 이해할 수 없습니다. Robba가 올바른지 확인하십시오. 출력을 (int)로 캐스팅하면 결과가 자동으로 잘립니다. (더블의 소수 부분을 무시하고).
Stephanie

4
(이 DateTime은 무시) 매우 오해의 소지가 있습니다
Lars Corneliussen

6

현재 시간에서 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.

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

아마도 그것을 DateTime의 확장 방법으로
만들어라

3

이 유틸리티 방법에 대한 가장 우아한 접근 방식을 결합했습니다.

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

2

이 솔루션은 내 상황에 도움이되었습니다.

   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)

0

시스템에 DateTimeOffset에 대한 ToUnixTimeMilliseconds가 있습니다

DateTime에 대해 비슷한 방법을 작성할 수 있습니다.

public static long ToUnixTimeSeconds(this DateTime value)
{
    return value.Ticks / 10000000L - 62135596800L;
}

10000000L-틱을 초로 변환

62135596800L-01.01.01을 01.01.1978로 변환

Utc 및 누수에 문제가 없습니다



0

다음은 다음을 지원하는 양방향 확장 클래스입니다.

  • 시간대 현지화
  • 초 또는 밀리 초 단위의 입력 / 출력.

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

밀리 초 및 초 형식을 혼동하지 않도록주의하십시오 (최상의 경우는 예외이며 최악의 경우는 비논리적 변환입니다). 나는 입력 / 출력을 밀리 초 형식으로 기본 설정했습니다. 초 형식을 기본값으로 사용하려면 isInMilliseconds = true (두 방법 모두)를 false로 전환하십시오.
SingleFlake

0

나는 잠시 동안 고군분투 한 후에 이것을 사용했으며, 시간대 오프셋에도 적합합니다.

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

-1

내가 사용하는 간단한 코드 :

public static long CurrentTimestamp()
{
   return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
}

이 코드는 1970-01-01 에서 현재 까지 총 밀리 초인 유닉스 타임 스탬프를 제공 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.