如何重构我的日期/时间以允许根据他们的区域为我的用户设置日期?

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 吗?

以上是关于如何重构我的日期/时间以允许根据他们的区域为我的用户设置日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何编辑我的 postgreSQL 查询以按日期选择几列的最新行

如何获取令牌以根据需要向授权的 PayPal 账户收费?

Paypal 订阅在特定日期自动付款?

怎么更改电脑日期格式

如何使用 aws 将用户路由到特定区域?

如何根据区域设置中定义的语言本地化 DatePicker 的日期格式