我需要能够存储没有时间成分的日期(年/月/日)。 这是日期的抽象概念,例如生日-我需要代表一年中的日期,而不是时间中的特定时刻。
我正在使用Java从一些输入文本中解析日期,并且需要存储在MySQL数据库中。 无论数据库,应用程序或任何客户端处于什么时区,他们都应该看到相同的年/月/日。
我的应用程序将在与数据库服务器具有不同系统时区的计算机上运行,并且我无法控制两者。 有没有人有一个优雅的解决方案来确保我正确存储日期?
我能想到这些解决方案,但似乎都不是很好:
查询我的MySQL连接的时区并解析该时区的输入日期
完全将日期作为字符串yyyy-MM-dd处理
我得出结论,当前应用程序(直接使用jdbc的简单实用程序)中最好的方法是直接作为字符串插入。对于更大的Hibernate应用程序,我可能不愿意编写自己的用户类型。虽然不能相信有人尚未通过一些公开的代码解决此问题...
是的,在Java代码中,为日期创建您自己的类型,或者仅使用字符串。 一个java.util.Date对象是一个特定的时间点,并且不能正确地建模您的用例。
我有一个类似的用例:一个独立于年份的任意日期,用于将我的数据与季节性数据相关联。 香港专业教育学院将月份和日期存储为整数而不是使用字符串,并且我不存储任何年份的表示。
您可以将所有时间/时区的内容归零:
public static Date truncateDate(Date date)
{
GregorianCalendar cal = getGregorianCalendar();
cal.set(Calendar.ZONE_OFFSET, 0); // UTC
cal.set(Calendar.DST_OFFSET, 0); // We don't want DST to get in the way.
cal.setTime(date);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.AM_PM, Calendar.AM);
return cal.getTime();
}
正是由于这个原因而存在类java.sql.Date,不幸的是,它使用起来非常不便,因为它只是扩展了java.util.Date而您必须手动将时间部分设置为零。
由于您指定的服务器和数据库位于不同的时区,因此在我看来您的解释存在问题。如果将日期清零,或者存储为MM-dd-YYYY(等同于同一件事),则存储服务器日期还是数据库日期?如果在服务器上是11:00 PM,而在数据库上是第二天凌晨1点,那么哪个日期正确?当您查看一年后的日期时,您是否还记得这些日期所依赖的机器时区?
这些考虑可能有些过大。但是,为什么不只将日期存储在格林尼治标准时间(如果您愿意,将秒归零)呢?
发问者不想保存特定的时间实例,而只想保存日期。 在这种情况下,出生日期。 因此,时区变得无关紧要,只有在解析时才应解释本地时区。 将时区设置为UTC / GMT实际上是一回事。 所以我看不到..您的答案中的任何一点。 我错过了什么吗? 我觉得我必须这样做,因为您的经验可能是我的一千倍。
您不能只在表中使用MySQL DATE类型,然后在插入语句中实质上使用格式化的字符串吗?我认为这样可以避免任何时区调整。
INSERT INTO time_table(dt) VALUES('2008-12-31')
您好,SQL注入漏洞!