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