QString转QDateTime失败,咨询时间字符串解析问题的原因
问题分析与解决思路
你的时间转换失败大概率是两个常见问题导致的,咱们一个个拆解:
1. 区域设置(Locale)不匹配
Qt的fromString方法解析ddd(星期缩写)和MMM(月份缩写)时,默认会沿用系统的区域设置。如果你的系统是中文环境,Qt默认用中文Locale,它根本不认识Fri、Jan这些英文缩写,自然解析失败。
解决起来很简单,在解析前强制设置英文Locale即可:
QString timestr("Fri Jan 5 14:03:11 CST 2018"); // 强制切换为英文区域设置 QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates)); QDateTime time1 = QDateTime::fromString(timestr, "ddd MMM d hh:mm:ss zzz yyyy"); qDebug() << time1.toString("yyyyMMdd");
2. 时区格式占位符错误
你在格式串里直接写了CST,但Qt的日期时间格式规则中,时区需要用专门的占位符(比如zzz)来匹配,而非硬编码时区字符串。而且CST本身有多重含义(中国标准时间、美国中部时间等),Qt无法直接解析硬编码的CST。
把格式串里的CST换成zzz,就能正确匹配字符串里的时区部分了。如果你的场景不需要时区信息,也可以先移除字符串里的CST再调整格式串:
QString timestr("Fri Jan 5 14:03:11 CST 2018"); // 移除时区字符串并修剪多余空格 timestr = timestr.replace("CST", "").trimmed(); QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates)); // 格式串去掉时区部分,注意对应多余的空格 QDateTime time1 = QDateTime::fromString(timestr, "ddd MMM d hh:mm:ss yyyy"); qDebug() << time1.toString("yyyyMMdd");
试试上面的方法,应该就能成功转换了!
内容的提问来源于stack exchange,提问作者y.leo
相关产品推荐
相关产品推荐

