【发布时间】:2018-04-20 13:06:40
【问题描述】:
好的,这可能是一个非常具体的问题,但我在断断续续地尝试解决这个问题的几个星期里都找不到任何解决方案。
我有一个 gitlab CI,它使用这个 docker 镜像编译 windows 可执行文件:https://github.com/mdimura/docker-mingw-qt5 (Arch linux mingw-w64 with qt5)
在我的 qml 文件中有以下代码:
var testTime = new Date
console.info("normal Date: " + testTime.toString())
console.info("Date.getHours: " + testTime.getHours())
console.info("Date.getUTCHours: " + testTime.getUTCHours())
console.info("Date.getTimezoneOffset: " + testTime.getTimezoneOffset())
当我在本地机器上编译并运行它时,我得到了预期的输出,例如:
Info: normal Date: Fr Apr 20 14:55:23 2018 GMT+0200
Info: Date.getHours: 14
Info: Date.getUTCHours: 12
Info: Date.getTimezoneOffset: -120
当我得到由 mingw 编译的可执行文件时,我得到以下输出:
Info: normal Date: Fr Apr 20 14:50:39 2018 GMT+0100
Info: Date.getHours: 13
Info: Date.getUTCHours: 12
Info: Date.getTimezoneOffset: -60
注意testTime.toString() 给出的时间在两种情况下都是正确的(时区除外),但时区偏移量和testTime.getHours() 给出的值相差一小时。
当我在 Windows 中将时间设置设置为不使用夏令时时,两个可执行文件都返回相同的正确值。
为了检查这真的是 qml 或 javascript 的错,我还添加了
qInfo() << "Qt time hour: " << QTime::currentTime().hour();
到我的 main.cpp。这也会在所有情况下打印正确的时间。
我什至自己在docker中编译了Qt包,仍然是同样的问题。有谁知道这里发生了什么以及我该如何解决?
【问题讨论】:
-
也许你需要一个特殊的文件来保存你的 mingw docker 镜像来告诉它你的时区是什么......
-
@mike510a docker 镜像不需要知道我的时区是什么,因为可执行文件应该在所有时区工作。而且时区定义和数据应该在 c 库中,不是吗?
-
不一定。在 Linux 上,时区是通过使用环境变量
TZ='America/New_York'; export TZ定义的,因此您很可能只需以这种方式定义时区,或者通过修改 docker 映像的/etc/文件夹中的文件(如果有)一个 -
@mike510a 不幸的是,这似乎没有帮助。我在 docker 映像中创建了指向我的时区的符号链接 /etc/localtime 并重建。错误仍然存在。
-
您是否尝试设置 TZ='' 环境变量?
标签: qt qml mingw cross-compiling