以UTC而不是本地检索时间(可能是anorm bug)

时间:2013-12-09 09:40:50

标签: scala anorm

在我的应用程序(使用anorm播放2.2)中,我希望仅将所有时间信息存储在UTC中。所以要做到这一点,我有一个隐含的下面的工作:

implicit val dateTimeToStatementUTC = new ToStatement[Date] {
      def set(s: java.sql.PreparedStatement, index: Int, aValue: Date): Unit = {
        if (aValue == null) {
          s.setTimestamp(index, null)
        } else {
          s.setTimestamp(index, new java.sql.Timestamp(aValue.getTime()), new GregorianCalendar(TimeZone.getTimeZone("UTC")))
        }
      }
    }

override def createPlaylist(play: CreatePlaylist) = {
    DB.withConnection { implicit conn =>
      SQL("INSERT INTO playlist (userId,date) VALUES ({userId},{date})").on(
        'userId -> play.userId, 'date -> play.date).executeInsert()
    }
  }

以上作品!但问题在于检索我需要获取UTC时间戳而不是本地时间戳。当我在下面执行时,它会在本地时区返回时间戳。 :

def getUserPlaylist(userId: Int): Seq[Playlist] = {
    DB.withConnection { implicit conn =>
      SQL("SELECT * from playlist where userId={uid}").on('uid -> userId).as(simple.*)
    }
  }

即。如果我在DB中插入5:30:00 IST。它插入00:00:00。但在检索和打印时,它会打印00:00:00 IST,因为它应该是5:30:00 IST(IST和UTC之间的时间不同是5小时30分钟)

如何根据UTC时区检索时间?在Java中我会做

resultSet.getTimestamp("date", 
     new GregorianCalendar(TimeZone.getTimeZone("UTC")))

修改 更多信息。我认为这可能是一个错误。

当我从Spring代码访问具有相同配置的相同DB时,

jdbcTemplate.query(“SELECT * from bookmarks where userId = 4”,new ResultSetExtractor(){

        @Override
        public String extractData(ResultSet rs) throws SQLException,
                DataAccessException {
            while(rs.next()){
                Timestamp a = rs.getTimestamp("date",Calendar.getInstance(TimeZone.getTimeZone("GMT")));
                SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
                System.out.println(d.format(a)+" <> "+rs.getObject("date")+" <> "+rs.getTimestamp("date"));
            }
            return null;
        }
    });

它打印:2013-12-09 05:30:00 IST&lt;&gt; 2013-12-09 05:30:00.0&lt;&gt; 2013-12-09 05:30:00.0 我的游戏项目给了我的地方:2013-12-09 00:00:00.0

1 个答案:

答案 0 :(得分:0)

问题得到解决。我正在使用它:

  

db.default.url = “JDBC:MySQL的://本地主机/视频useLegacyDatetimeCode =假安培;了useUnicode =真安培; serverTimezone = UTC&安培;”

而不是:

  

JDBC:MySQL的://本地主机/视频useLegacyDatetimeCode =假安培;了useUnicode =真安培; serverTimezone = UTC

&的每次使用中,我们必须在amp附加它。这不应该与游戏一起使用。