10b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary/*
20b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary * Copyright 2015 Google Inc.
30b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary *
40b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary * Use of this source code is governed by a BSD-style license that can be
50b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary * found in the LICENSE file.
60b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary */
70b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary
84dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#include "SkLeanWindows.h"
90b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary#include "SkString.h"
100b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary#include "SkTime.h"
112b12376849c10df26cb6ecade2475460282f6a3fhalcanary#include "SkTypes.h"
12f2509381bdd9e712919418f7ebe831f974208154mtklein#include <chrono>
130b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary
140b9d4118ba4f3f1190c063492894e324c63e8fd8halcanaryvoid SkTime::DateTime::toISO8601(SkString* dst) const {
150b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary    if (dst) {
160b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary        int timeZoneMinutes = SkToInt(fTimeZoneMinutes);
170b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary        char timezoneSign = timeZoneMinutes >= 0 ? '+' : '-';
1860e0fee6d4acff638ccc9670c4055aced529a7a0bungeman        int timeZoneHours = SkTAbs(timeZoneMinutes) / 60;
1960e0fee6d4acff638ccc9670c4055aced529a7a0bungeman        timeZoneMinutes = SkTAbs(timeZoneMinutes) % 60;
200b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary        dst->printf("%04u-%02u-%02uT%02u:%02u:%02u%c%02d:%02d",
210b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary                    static_cast<unsigned>(fYear), static_cast<unsigned>(fMonth),
220b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary                    static_cast<unsigned>(fDay), static_cast<unsigned>(fHour),
230b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary                    static_cast<unsigned>(fMinute),
240b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary                    static_cast<unsigned>(fSecond), timezoneSign, timeZoneHours,
250b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary                    timeZoneMinutes);
260b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary    }
270b9d4118ba4f3f1190c063492894e324c63e8fd8halcanary}
2833eefcd58bffc35355382dd7b1b79a02b99f8c6cmtklein
298f11d4dcafef4447fa68ea0ab28a72589241e9fdMike Klein#ifdef SK_BUILD_FOR_WIN
302b12376849c10df26cb6ecade2475460282f6a3fhalcanary
312b12376849c10df26cb6ecade2475460282f6a3fhalcanaryvoid SkTime::GetDateTime(DateTime* dt) {
322b12376849c10df26cb6ecade2475460282f6a3fhalcanary    if (dt) {
332b12376849c10df26cb6ecade2475460282f6a3fhalcanary        SYSTEMTIME st;
342b12376849c10df26cb6ecade2475460282f6a3fhalcanary        GetSystemTime(&st);
352b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fTimeZoneMinutes = 0;
362b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fYear       = st.wYear;
372b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fMonth      = SkToU8(st.wMonth);
382b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fDayOfWeek  = SkToU8(st.wDayOfWeek);
392b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fDay        = SkToU8(st.wDay);
402b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fHour       = SkToU8(st.wHour);
412b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fMinute     = SkToU8(st.wMinute);
422b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fSecond     = SkToU8(st.wSecond);
432b12376849c10df26cb6ecade2475460282f6a3fhalcanary    }
442b12376849c10df26cb6ecade2475460282f6a3fhalcanary}
452b12376849c10df26cb6ecade2475460282f6a3fhalcanary
468f11d4dcafef4447fa68ea0ab28a72589241e9fdMike Klein#else // SK_BUILD_FOR_WIN
472b12376849c10df26cb6ecade2475460282f6a3fhalcanary
482b12376849c10df26cb6ecade2475460282f6a3fhalcanary#include <time.h>
492b12376849c10df26cb6ecade2475460282f6a3fhalcanaryvoid SkTime::GetDateTime(DateTime* dt) {
502b12376849c10df26cb6ecade2475460282f6a3fhalcanary    if (dt) {
512b12376849c10df26cb6ecade2475460282f6a3fhalcanary        time_t m_time;
522b12376849c10df26cb6ecade2475460282f6a3fhalcanary        time(&m_time);
532f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        struct tm tstruct;
542f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        gmtime_r(&m_time, &tstruct);
552b12376849c10df26cb6ecade2475460282f6a3fhalcanary        dt->fTimeZoneMinutes = 0;
562f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fYear       = tstruct.tm_year + 1900;
572f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fMonth      = SkToU8(tstruct.tm_mon + 1);
582f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fDayOfWeek  = SkToU8(tstruct.tm_wday);
592f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fDay        = SkToU8(tstruct.tm_mday);
602f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fHour       = SkToU8(tstruct.tm_hour);
612f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fMinute     = SkToU8(tstruct.tm_min);
622f0471281074f3dc3d22dadef6505ecf481488f3Hal Canary        dt->fSecond     = SkToU8(tstruct.tm_sec);
632b12376849c10df26cb6ecade2475460282f6a3fhalcanary    }
642b12376849c10df26cb6ecade2475460282f6a3fhalcanary}
658f11d4dcafef4447fa68ea0ab28a72589241e9fdMike Klein#endif // SK_BUILD_FOR_WIN
662b12376849c10df26cb6ecade2475460282f6a3fhalcanary
67122f18ede856e5aca736c759f33daed0a903525bMike Klein#if !defined(__has_feature)
68122f18ede856e5aca736c759f33daed0a903525bMike Klein    #define  __has_feature(x) 0
69122f18ede856e5aca736c759f33daed0a903525bMike Klein#endif
70122f18ede856e5aca736c759f33daed0a903525bMike Klein
71f2509381bdd9e712919418f7ebe831f974208154mtkleindouble SkTime::GetNSecs() {
72122f18ede856e5aca736c759f33daed0a903525bMike Klein#if __has_feature(memory_sanitizer)
73122f18ede856e5aca736c759f33daed0a903525bMike Klein    // See skia:6504
74122f18ede856e5aca736c759f33daed0a903525bMike Klein    struct timespec tp;
75122f18ede856e5aca736c759f33daed0a903525bMike Klein    clock_gettime(CLOCK_MONOTONIC, &tp);
76122f18ede856e5aca736c759f33daed0a903525bMike Klein    return tp.tv_sec * 1e9 + tp.tv_nsec;
77122f18ede856e5aca736c759f33daed0a903525bMike Klein#else
78f2509381bdd9e712919418f7ebe831f974208154mtklein    auto now = std::chrono::high_resolution_clock::now();
79f2509381bdd9e712919418f7ebe831f974208154mtklein    std::chrono::duration<double, std::nano> ns = now.time_since_epoch();
80f2509381bdd9e712919418f7ebe831f974208154mtklein    return ns.count();
81122f18ede856e5aca736c759f33daed0a903525bMike Klein#endif
82f2509381bdd9e712919418f7ebe831f974208154mtklein}
83