2010-10-27 20 views
8

tôi xây dựng một QDateTime từ một chuỗi như thế này:Chuyển đổi một QDateTime trong UTC gian hệ thống địa phương

QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ"); 

Tôi biết rằng date là trong UTC bởi vì đó là cách nó được lưu trữ. Nhưng khi tôi muốn hiển thị ngày này cho người dùng, nó phải nằm trong múi giờ địa phương của người dùng. date.toLocalTime() có vẻ đầy hứa hẹn, nhưng nó trả về cùng ngày chính xác!

Làm cách nào để chuyển đổi date thành giờ địa phương của hệ thống để hiển thị cho người dùng?

Dưới đây là một số thất bại hơn:

#include <QtCore/QCoreApplication> 
#include <QtCore/QDateTime> 
#include <QtCore/QDebug> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ"); 
    QDateTime local = date.toLocalTime(); 

    qDebug() << "utc: " << date; 
    qDebug() << "local: " << local.toString(); 
    qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate); 

    return a.exec(); 
} 

Output:

utc: QDateTime("Mon Oct 25 10:28:58 2010") 
local: "Mon Oct 25 10:28:58 2010" 
hax: "Monday, October 25, 2010 10:28:58 AM" 

Trả lời

17

QDateTime biết liệu đó là giờ UTC hay giờ địa phương. Ví dụ:

QDateTime utc = QDateTime::currentDateTimeUtc(); 
QDateTime local = QDateTime::currentDateTime(); 

local.secsTo(utc) // zero; these dates are the same even though I am in GMT-7 

Chúng ta cần phải nói date rằng đó là một thời gian ngày UTC với date.setTimeSpec(Qt::UTC):

#include <QtCore/QCoreApplication> 
#include <QtCore/QDateTime> 
#include <QtCore/QDebug> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ"); 
    date.setTimeSpec(Qt::UTC); 
    QDateTime local = date.toLocalTime(); 

    qDebug() << "utc: " << date; 
    qDebug() << "local: " << local.toString(); 
    qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate); 

    return a.exec(); 
} 

Output:

utc: QDateTime("Mon Oct 25 10:28:58 2010") 
local: "Mon Oct 25 03:28:58 2010" 
hax: "Monday, October 25, 2010 3:28:58 AM" 

Tôi đang ở GMT-7, vì vậy đúng rồi đó.

0

Đang sử dụng QDateTime::toString() không đem lại cho bạn kết quả mong đợi?

Có thể bạn có thể thử sử dụng định dạng khác với QDateTime::toString(Qt::SystemLocaleLongDate) hoặc QDateTime::toString(Qt::SystemLocaleShortDate).

Nếu không, tôi sẽ cố gắng sử dụng QLocale::dateTimeFormat() để lấy định dạng cục bộ dưới dạng QString và sau đó sử dụng chuỗi này làm thông số định dạng QDateTime::toString(), nhưng tôi không nghĩ nó sẽ thay đổi bất cứ thứ gì.

+0

đã dùng thử, không hoạt động. xem chỉnh sửa cho câu hỏi – andrewrk

Các vấn đề liên quan