Tôi đã làm việc với một số chức năng thời gian hôm nay và nhận thấy rằng chuyển đổi tiêu chuẩn sử dụng %r
(hoặc %p
) dường như không hoạt động đối với đầu vào qua std::get_time()
trên g ++ hoặc clang ++. Xem this live code version cho g ++ và clang ++. Nó hiện dường như hoạt động như mong đợi trong Windows với VC++ (xem này closely related question). Cũng lưu ý rằng hiệu quả là giống nhau hay không có dòng imbue
được bao gồm. Miền địa phương trên máy Linux của tôi được đặt thành "en_US.UTF-8"
nếu nó quan trọng.Là std :: get_time bị hỏng trong g ++ và clang ++?
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
int main(){
std::tm t{};
std::stringstream ss{"1:23:45 PM"};
ss.imbue(std::locale(std::cin.getloc(),
new std::time_get_byname<char>("en_US")));
ss >> std::get_time(&t, "%r");
if (ss.fail()) {
std::cout << "Conversion failed\n" << std::put_time(&t, "%r") << '\n';
} else {
std::cout << std::put_time(&t, "%r") << '\n';
}
}
Điều này có vẻ là vấn đề libstdC++. clang với libC++ phân tích cú pháp này. –
@HowardHinnant: Bạn đang [phải] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Tôi có nên trả lời câu hỏi này không? – Edward
Dường như [triển khai] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facets_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) không xử lý '% r' hoặc'% p'. Nếu có một nơi khác mà họ phải được xử lý, tôi không thể tìm thấy nó. – interjay