Могу ли я использовать [strftime] C ++, чтобы сделать то, что может сделать Java SimpleDateFormat? - PullRequest
0 голосов
/ 01 ноября 2019

Могу ли я использовать strftime из C ++, чтобы сделать то же, что и в Java. Мой формат ввода такой же синтаксис, как SimpleDateFormat, но я думаю, что я должен использовать strftime, потому что это единственная библиотека, которую я могу найти, которая может форматировать datetime.

tz_offset - это функция для вычисления часового пояса

   long tz_offset(time_t when)
    {
        if (when == NULL_TIME)
            when = std::time(nullptr);
        auto const tm = *std::localtime(&when);
        std::ostringstream os;
        os << std::put_time(&tm, "%z");
        std::string s = os.str();
        // s is in ISO 8601 format: "±HHMM"
        int h = std::stoi(s.substr(0, 3), nullptr, 10);
        int m = std::stoi(s[0] + s.substr(3), nullptr, 10);

        return h * 3600 + m * 60;
    }

Это моя функция даты формата

 std::string FormatDate(double timestamp, std::string format) {
    std::ostringstream os;
    tm* curr_tm;
    time_t timenum = timestamp / 1000;
    char date_string[100];
    if (format.empty()) {
        int millisecond = timestamp - (long long)((long long)(timestamp / 1000) * 1000);        
        curr_tm = localtime(&timenum);
        strftime(date_string, 50, "%Y-%m-%dT%H:%M:%S.", curr_tm);
        os << date_string << std::to_string(millisecond) << "+0" << std::to_string(tz_offset() / 3600) << "00"; 
        //My output : 2019-11-01T08:44:39.152+0700
    }
    else {
    //what I must do here??
    }   

    return os.str();
}

Мой основной класс

  int main()
    {
        std::string format = "h 'o''cloch' a, zzzz";
        FormatDate(1572492011438, format);
        return 0;
    }

Что я сделал, так это если строка формата пуста, поэтому я сразу перейду к формату по умолчанию. Но как насчет строки формата ввода пользователя. Я думаю о функции замены строк.

08 o'clock AM, Indochina Time

1 Ответ

1 голос
/ 01 ноября 2019

Похоже, что в ICU есть синтаксический анализатор для формата: https://unicode -org.github.io / icu-docs / apidoc / release / icu4c / classicu_1_1SimpleDateFormat.html # details

РЕДАКТИРОВАТЬ: добавить пример

UErrorCode status = U_ZERO_ERROR;
UnicodeString datePattern("h 'o''cloch' a, zzzz", "");
SimpleDateFormat* formatter = new SimpleDateFormat(datePattern, status);
UnicodeString formatted;
formatter->format(Calendar::getNow(), formatted, status);
std::string formattedOut;
formatted.toUTF8String(formattedOut);
std::cout << formattedOut << "\n";
$ g++ icu.cpp -licuuc -licui18n
$ ./a.out
12 o'cloch AM, GMT-05:00
...