मैं विंडोज रनटाइम कंपोनेंट में std::tm को Windows::Foundation::DateTime में बदलने की कोशिश कर रहा हूं।

Windows::Foundation::DateTime में एकमात्र संपत्ति UniversalTime है जिसे निम्न के रूप में परिभाषित किया गया है:

एक 64-बिट हस्ताक्षरित पूर्णांक समय में एक बिंदु का प्रतिनिधित्व करता है क्योंकि 1 जनवरी, 1601 को या उससे पहले मध्यरात्रि के बाद या उससे पहले 100-नैनोसेकंड अंतराल की संख्या।

क्या std में यह मान प्राप्त करने का कोई तरीका है? या रूपांतरण करने का एक मानक तरीका है?

1
Yuchen 20 नवम्बर 2015, 01:49

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 से

1
fghj 19 नवम्बर 2015, 23:42

इस स्थिरांक को प्राप्त करने का एक और तरीका है, लेकिन दो ग्रेगोरियन को क्रमबद्ध करने के लिए इस दिनांक लाइब्रेरी की आवश्यकता होती है खजूर:

#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
1
Howard Hinnant 21 मई 2016, 21:45