मैं विंडोज रनटाइम कंपोनेंट में std::tm
को Windows::Foundation::DateTime
में बदलने की कोशिश कर रहा हूं।
Windows::Foundation::DateTime
में एकमात्र संपत्ति UniversalTime
है जिसे निम्न के रूप में परिभाषित किया गया है:
एक 64-बिट हस्ताक्षरित पूर्णांक समय में एक बिंदु का प्रतिनिधित्व करता है क्योंकि 1 जनवरी, 1601 को या उससे पहले मध्यरात्रि के बाद या उससे पहले 100-नैनोसेकंड अंतराल की संख्या।
क्या std
में यह मान प्राप्त करने का कोई तरीका है? या रूपांतरण करने का एक मानक तरीका है?
2 जवाब
आप mktime
के साथ यूनिक्स में समय बदल सकते हैं, और फिर मैजिक नंबर 116444736000000000ULL
जोड़ें:
/* shift is difference between 1970-Jan-01 & 1601-Jan-01
* in 100-nanosecond intervals */
const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008
boost/date_time/filetime_functions.hpp
से
इस स्थिरांक को प्राप्त करने का एक और तरीका है, लेकिन दो ग्रेगोरियन को क्रमबद्ध करने के लिए इस दिनांक लाइब्रेरी की आवश्यकता होती है खजूर:
#include "date.h"
int
main()
{
using namespace std::chrono;
using namespace date;
using namespace std;
using wticks = ratio_multiply<nano, ratio<100>>;
constexpr duration<int64_t, wticks> t =
sys_days{jan/1/1970} - sys_days{jan/1/1601};
static_assert(t.count() == 116444736000000000, "");
}
यह संकलन समय पर करने के लिए C ++ 14 की आवश्यकता है। C ++ 11 में, इसे रन टाइम पर किया जा सकता है (अर्थात आप t
को t
घोषित नहीं कर सकते या C ++ 11 में static_assert
में उपयोग नहीं कर सकते। दिनांक लाइब्रेरी को वीएस -2015 में पोर्ट किया गया है, लेकिन वर्तमान में constexpr
उस मंच के लिए अक्षम।
अपडेट
यहाँ कोड है जो 1 जनवरी, 1601 से एक स्थानीय tm
को 100-नैनोसेकंड इकाइयों की संख्या में परिवर्तित करता है। कंप्यूटर के स्थानीय समयक्षेत्र का पता लगाने के लिए, यह timezone लाइब्रेरी की आवश्यकता है।
#include "date.h"
#include "tz.h"
#include <iostream>
#include <thread>
int
main()
{
using namespace std::chrono;
using namespace date;
using namespace std;
// Concurrently initialize timezone database (as an optimization)
thread{get_tzdb}.detach();
// get an example local tm
auto now = time(nullptr);
struct tm tm = *localtime(&now);
// convert tm into a local time_point
auto local_tp = local_days{year{tm.tm_year+1900}/(tm.tm_mon+1)/tm.tm_mday}
+ hours{tm.tm_hour} + minutes{tm.tm_min} + seconds{tm.tm_sec};
// convert local time_point to UTC time_point
auto tp = current_zone()->to_sys(local_tp);
// Create handy types for dealing with 100-nanosecond units
using wperiod = ratio_multiply<nano, ratio<100>>;
using wticks = duration<int64_t, wperiod>;
// Get number of 100-nanosecond intervals since Jan 1, 1601 00:00:00 UTC
auto t = wticks{tp - sys_days{jan/1/1601}};
cout << t.count() << '\n';
}
यह सिर्फ मेरे लिए उत्पादन:
130925235970000000
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।