Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grails/mysql时区更改_Mysql_Datetime_Grails_Timezone_Convert Tz - Fatal编程技术网

grails/mysql时区更改

grails/mysql时区更改,mysql,datetime,grails,timezone,convert-tz,Mysql,Datetime,Grails,Timezone,Convert Tz,改变应用程序时区的最佳方法是什么?在我看来,必须发生以下情况: 服务器TZ由系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert_tz或等效工具更新所有值。因此,要么编写一个mysql脚本,要么编写一个grails脚本,加载每个类的每一行,更新所有时间字段 显然,在发生这种情况时,应该关闭服务器,并且在发生错误时必须进行备份 有更好/更简单的方法吗?Java在使用日期时不使用时区;它将所有内容存储为UTC,并且在显示日期时仅使用时区。有关java日期/时间的讨

改变应用程序时区的最佳方法是什么?在我看来,必须发生以下情况:

  • 服务器TZ由系统管理员更改
  • mysql必须重新启动
  • 数据库中每个基于时间的列都必须使用convert_tz或等效工具更新所有值。因此,要么编写一个mysql脚本,要么编写一个grails脚本,加载每个类的每一行,更新所有时间字段
  • 显然,在发生这种情况时,应该关闭服务器,并且在发生错误时必须进行备份


    有更好/更简单的方法吗?

    Java在使用日期时不使用时区;它将所有内容存储为UTC,并且在显示日期时仅使用时区。有关java日期/时间的讨论,请参见以下链接。

    • 如果您在MySQL中使用Date、Time或DateTime列类型,时区并不重要
    • 如果您使用的是TIMESTAMP列类型,则时区可能很重要,因为时间戳存储为UTC,但在检索和存储值时已完成转换。有关MySQL时区行为的讨论,请参阅
    • 如果您担心在不同时区的多台服务器上同步对象,事情会变得更复杂,请参阅下面的线程来讨论这一点。

    我们在使用GORM和使用groovy.sql.sql(用于更快的数据导入)之间的时间差方面遇到了问题

    GORM使用的是我们在引导中设置的grails配置时区(UTC),而groovy sql使用的是默认的系统时区(GMT)

    通过在$JAVA_OPTS中设置时区就解决了这个问题,不过您可以将开关添加到grails OPTS或run-app命令中


    grails-Duser.timezone=UTC运行应用程序

    我知道这是一个老问题,但我认为它也非常永恒。。。至少,我最近有好几次偶然发现它。。。所以我想我会贡献我的解决方案

    首先,我使用Grails2.5.1和PostgreSQL 9.4作为后端

    其次,Groovy/Grails中的日期字段在PostgreSQL中存储为不带时区的时间戳。因此,在我看来,上面的第一个答案实际上并不完全正确——日期没有存储在UTC中。这个观察让我想到。。。就像“如果数据库不知道时区是什么,谁知道”?我想到的第一个答案是“也许是春天”

    第三,我的问题的具体原因是,我有很多日期是通过
    BootStrap.groovy
    newthisclass().save()引导到数据库中的。因为这些是日期,而不是日期+时间,所以它们看起来都像PostgreSQL时间戳(没有时区)

    第四,当我编辑了我的一个GSP,将时区包含在日期格式字符串中,显示为PST(我的服务器所在的位置)时,真正使价格下降的是;当我将
    timeZone=“Asia/Kolkata”
    包含在相关字段的
    g:formatDate
    中时,时间提前了12h30。很明显,我的服务器是在PST8PDT中运行的,因为那不是PostgreSQL,所以我回到Spring,作为改变事情的潜在场所

    第五,在阅读了一些关于在
    grails app/conf/spring/resources.groovy中设置语言环境的评论之后,我决定尝试在那里设置语言环境和时区,如下所示:

    // Place your Spring DSL code here
    beans = {
        // from http://stackoverflow.com/questions/1569446/grails-how-to-change-the-current-locale
        localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
            defaultLocale = new Locale("en","IN")
            java.util.Locale.setDefault(defaultLocale)
            println "configure spring/resources.groovy defaultLocale $defaultLocale"
            defaultTimeZone = TimeZone.getTimeZone("Asia/Kolkata")
            java.util.TimeZone.setDefault(defaultTimeZone)
            println "configure spring/resources.groovy defaultTimeZone $defaultTimeZone"
        }
    }
    
    我还为我的所有日期字段使用了
    g:format timezone=“Asia/Kolkata”format=“dd MMM,yyyy a z”
    。这似乎解释了PostgreSQL
    timestamp
    字段中正确时区和预期小时(即输入的小时)的所有数据,即使日期最初输入的是“在错误的时区”

    第六,
    g:datePicker
    ——我读了很多关于让这个“时区敏感”的帖子,但我发现它的日期被解释为Spring使用的时区,所以在我的例子中,这正是我需要的。相反,如果有人想在他们的区域设置中输入日期,并让Spring动态地将日期转换为服务器的时区,我想这需要一些额外的工作


    我个人认为,如果
    g:datePicker
    接受
    timeZone
    作为参数,并以与
    g:formatDate
    相同的方式使用它,那将非常酷。

    我认为,每当我们使用新日期()时,我们得到的时间就是JVM的时区,它是从服务器的时区复制的。