如何重构我的日期/时间以允许根据他们的区域为我的用户设置日期?
Posted
技术标签:
【中文标题】如何重构我的日期/时间以允许根据他们的区域为我的用户设置日期?【英文标题】:How to refactor my date/time to allow for setting dates for my users based on their zone? 【发布时间】:2012-04-23 18:37:00 【问题描述】:我的代码目前使用 java 日期。
mysql 有列日期时间。
我希望允许用户设置他们的时区,然后在我的应用程序中我将转换日期以反映他们的时区。
我正在使用 Spring mvc。
我该怎么做?
【问题讨论】:
参考之前的问题:***.com/questions/6874146/… 【参考方案1】:MySQL 中的Datetime
类型没有与之关联的时区。相反,默认情况下,Connector/J(MySQL JDBC 驱动程序)使用 服务器时区 获取日期。有一个设置可以改变它,但我不知道它是否记录在案,我不得不查看源代码以了解它是如何工作的。
我可以将用户的时区另存为VARCHAR
,并在创建日期对象时使用它。如果您不想更改所有数据,可以使用服务器默认时区填充time_zone
列,然后逐步更改用户的时区。使用以下代码,您可以获得 UTC 时间戳。 Calendar/Date 对象非常混乱,最好使用Joda Time。
ResultSet rs = null;
Date date = rs.getDate("date");
TimeZone userTimeZone = TimeZone.getTimeZone(rs.getString("time_zone"));
Calendar c = Calendar.getInstance(userTimeZone);
c.set(1900 + date.getYear(), date.getMonth(),
date.getDate(), date.getHours(),
date.getMinutes(), date.getSeconds());
//what you are actually interested in
long utcTimestamp = c.getTimeInMillis();
【讨论】:
【参考方案2】:常见的策略是使用 UTC (+0) 将日期和时间信息存储在数据库中,然后在 GUI 层中与用户的时区偏好进行转换。
【讨论】:
如果我的日期已经在一个特定的时区,我可以很容易地调整否? UTC 的最佳功能之一是您可以避免夏令时的混乱。如果你想拥有一个时区感知应用程序,我肯定会在数据层和服务层中都使用 UTC。 @erikxiv 这确实是最好的,但在现有系统上,这样的数据迁移有时可能难以完成。 @KirilRaychev 非常正确,但另一方面,我看到了许多由临时时区处理导致的令人讨厌的错误,没有给出公平的警告。 @KirilRaychev 我的应用程序还没有上线,所以我仍然可以这样做。我还在 mysql 中使用 datetime 吗?以上是关于如何重构我的日期/时间以允许根据他们的区域为我的用户设置日期?的主要内容,如果未能解决你的问题,请参考以下文章