目前我以毫秒为单位存储用户的出生日期(自1970年1月1日起)。我是否必须确保它与每个国家的出生日期相同,或者11月11日在X国和11月12日在Y国是否常见?
如果通常的做法是在每个国家/地区拥有完全相同的出生日期,我怎样才能确保我存储的毫秒数始终指向每个国家/地区的同一天?
答案 0 :(得分:4)
很少有人知道他们出生的时间。所以,不,通常不会跟踪这种详细程度。你永远不会在护照上看到出生时间和出生时间等。它们跟踪仅限日期的值,没有时间和没有时区。
调酒师,边境管制代理人等使用当地当前日期来计算年龄,而不是考虑考虑时间或调整时区。考虑截断,忽略部分日差异。
要准确地将时间从一个时区调整到另一个时区,您需要一个日期和一个时间。如果没有一天的时间,你可能已经有23-25个小时的出生时间。
例如,24日在巴黎午夜几分钟(比UTC早1或2小时)发生的出生仍然是“昨天”23日在蒙特利尔(比UTC晚4或5小时)。但如果这个出生发生在24日06:00,则巴黎和日期的日期相同(第24天)。蒙特利尔,但是在温哥华不列颠哥伦比亚省和西雅图的“昨天”(23日),时钟比UTC晚7或8小时。
在SQL中使用类似于标准DATE类型的数据类型。
在Java中,使用LocalDate
类型。要表示生日庆典的定期月份和日期,请使用MonthDay
课程。
为了与数据库进行交互,符合JDBC 4.2的驱动程序应该能够通过LocalDate
和getObject
直接与setObject
一起工作。 PreparedStatement
上的java.sql.Date
个方法。如果没有,请回到使用旧的YYYY-MM-DD
。添加到旧类的新方法有助于转换。
生成日期时间值的字符串表示时,请使用ISO 8601标准中定义的格式,例如1960-07-11
,例如:--MM-DD
。对于没有年份使用的日期--07-11
,例如:00:00:00
。在解析和生成字符串时,Java中的java.time类默认使用ISO 8601格式。
如果由于某种原因您被迫将日期值放入日期时间字段,那么您必须设置一些任意时间。中午是一种可能性。我建议将时间部分设置为当天的第一个时刻。
请注意,第一个时刻不总是01:00:00
。夏令时(DST)以及其他一些异常会影响某些时区的午夜。因此,当天的第一时刻可能是ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
ZonedDateTime startOfToday = today.atStartOfDay( zoneId );
。 Java可以确定适合特定时区的当天的第一时刻。
SaveChanges()
答案 1 :(得分:2)
由您自行决定在选择出生日期时解释所选出生日期的时区以及在显示出生日期时使用的时区。在我看来,在将出生日期从时间戳转换为可读形式和存储时,始终使用出生地的时区(如果您希望收集)是合乎逻辑的。否则,您可以随时使用GMT或任何其他时区作为约定。这将确保所有国家/地区的所有用户都看到相同的出生日期,但建议将时区附加到日期表示以防止混淆。您当然可以选择在创建存储的时间戳时将日期解释为GMT,然后使用用户定义的时区(可能是用户帐户的时区)呈现出生日期。在这种情况下,每个用户的日期(以及包含出生时间的时间)将会有所不同。