如何在Play Framework 2.0中为生产和测试设置UTC时区?

时间:2013-04-03 22:58:08

标签: mysql timezone playframework-2.0

我们希望Play Framework 2.0 Scala应用程序能够在应用服务器和MySQL数据库服务器中处理UTC中的所有日期和时间信息。

诀窍是:

  • 不改变部署环境
  • 不改变CI(测试)环境
  • 不改变本地(dev)环境

这样做有标准的最佳做法吗?我们希望测试以UTC格式运行,而不必在所有命令行上传递-Duser.timezone=GMT。使用play start启动服务器同上。

1 个答案:

答案 0 :(得分:7)

这比我们预期的要容易。

首先,在application.conf中,使用参数as described on another StackOverflow question配置JDBC URL:

# Set MySQL Connector/J to use UTC server connection and time conversions
#   see https://stackoverflow.com/questions/10488529/gettimestamp-does-timezone-converstion-twice-in-mysql-jdbc-connector
db.default.url="jdbc:mysql://localhost/database?useGmtMillisForDatetimes=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&useTimezone=true&serverTimezone=UTC"

其次,在Build.scala中,设置Java系统属性和默认值:

// Setting this property here forces the JVM to run in UTC time, 
// both for test (`play test`) and development (`play start`) modes, 
// but not for production (`play dist`).
System.setProperty("user.timezone", "GMT")
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))

这两项更改将同时处理测试play test)和开发play start)模式。

对于生产play dist),必须在启动前设置该属性。例如,通过:

  1. 编辑生成的start脚本以添加export _JAVA_OPTIONS=-Duser.timezone=GMT
  2. 使用start
  3. 调用-Duser.timezone=GMT脚本
  4. 在调用System.setProperty("user.timezone", "GMT")
  5. 后在现有JVM中启动