1970 년 이후 현재 타임 스탬프를 밀리 초 단위로 얻는 방법


134

Java에서는 System.currentTimeMillis()epoch 시간 이후 현재 시간 소인을 밀리 초 단위로 가져 오는 데 사용할 수 있습니다.

현재 시간과 1970 년 1 월 1 일 자정 (UTC)의 차이 (밀리 초)입니다.

C ++에서 같은 것을 얻는 방법?

현재 이것을 사용하여 현재 타임 스탬프를 얻습니다.

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

이게 옳은가 아닌가?

답변:


239

C ++ 11 라이브러리에 액세스 할 수있는 경우 라이브러리를 확인하십시오 std::chrono. Unix Epoch 이후 다음과 같이 밀리 초를 얻는 데 사용할 수 있습니다.

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
좋은. 기본 유형 형식으로 밀리 초 수를 얻으려면 행 끝에 count ()를 추가하십시오.
P1r4nh4 2018

1
@lining : 두 시대는 동일 할 수 있지만 값은 다를 수 있습니다. steady_clock에포크 이후로 시간의 진정한 척도 인 동시에 에포크 이후 system_clock의 논리적 시간을 나타낼 수 있습니다. 윤초마다 시스템의 구현에 따라 둘이 더 멀어 질 수 있습니다.
오즈.

4
내가 아는 한, 각 시계의 시대는 구현에 따라 다릅니다. 협약은 system_clock유닉스 시대와 동일하지만, 스펙은 단지 시스템 전체의 실시간 벽시계 여야한다고 말합니다. steady_clock현실과 일치 할 필요는 없으며 단지 앞으로 나아가 야합니다.
오즈.

1
@Jason Windows에서 gettimeofday를 사용할 수없는 것 외에도 크로노 라이브러리는 더 높은 해상도를 제공하고 (gtod는 마이크로 초로 제한됨) 형식 단위 방식으로 시간 단위를 제공하여 컴파일러가 단위 변환을 시행하고 일반 산술 연산자 ( timeval구조체를 추가하는 것은 성가신 일입니다).
오즈.

3
자바 스크립트 개발자는 이것을보고 웃고있다 :(
fantastory

42

사용하다 <sys/time.h>

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

이것을 참조 하십시오 .


좋은 해결책이자 gettimeofday (& tp, NULL);
Adem

4
우선, 이것은 C ++가 아닌 C입니다. 둘째, gettimeofday에 문제가 있습니다 . 예를 들어 이것을 참조하십시오 .
rustyx

17

이 답변은 C ++을 사용 하는 Oz 와 비슷합니다. 오즈에서<chrono> 얻지 못했습니다. 그러나...

이 페이지 하단 에서 원본 스 니펫을 집어 들고 완전한 콘솔 앱으로 약간 수정했습니다. 나는이 릴 '을 사용하는 것을 좋아합니다. VB 또는 덜 현대적이고 독자 친화적 인 코드를 사용하지 않고 실제 밀리 초 안에 시대를 맞이하기 위해 Windows에서 많은 스크립트를 작성하고 신뢰할 수있는 도구가 필요한 경우 환상적입니다.

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

음수가 나옵니다. -560549313맞지 않습니까?
Noitidart

1
@Noitidart 어떤 플랫폼과 C ++ 컴파일러를 사용하고 있는지 말해 줄 수 있습니까? 나는 이것을 자동화 도구와 함께 항상 사용하며, 부정적인 출력 o.0를 본 적이 없다. 또한 직접 사본입니까, 수정 / 통합 프로그램입니까? 이 코드에서만 발생하는지 확인하고 싶습니다.
kayleeFrye_onDeck

5
아 @ kayleeFrye_onDeck 사용 중이기 때문에 int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. 나는 그것을 버리고 int64_t작동합니다! 더 많은 정보를 요청 해 주셔서 감사합니다.
Noitidart

unsigned long long이식성이 뛰어나고 __int64MSVC에서만 사용할 수 있습니다.
SS Anne

__int64표준 C ++ 에는 유형 이 없습니다 . std::int64_t대신 사용할 수 있습니다 .
jaskmar

14

C ++ 11부터 다음을 사용할 수 있습니다 std::chrono.

  • 현재 시스템 시간을 얻습니다. std::chrono::system_clock::now()
  • 신기원부터 시간을 가지십시오 : .time_since_epoch()
  • 기본 단위를 밀리 초로 변환하십시오. duration_cast<milliseconds>(d)
  • 오버플로를 피하기 위해 std::chrono::milliseconds정수로 변환uint64_t
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

unsigned long long대신에 사용 하는 것이 좋습니다 uint64_t.
csg

13

gettimeofday를 사용하면 long long으로 캐스트해야합니다. 그렇지 않으면 에포크 이후 오버 플로우가 발생하여 실제 밀리 초가되지 않습니다. long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; 에포크 후 8 일이 지난 767990892와 같은 숫자를 제공합니다. ;-).

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

-25

기능을 포함 <ctime>하고 사용하십시오 time.


30
에포크 이후 초를 반환합니다. 밀리 초가 아닙니다.
Progo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.