如何修复1970年以前的格里高历日期的变量“时间”。或者1970年以前的格里高利历的变量“时间”的单位是多少?
我使用hibernate进行对象关系映射。我试图保存到我的数据库的数据是日期类型格里高利历。但是,只要日期小于1970,我的应用程序就会崩溃。
答案 0 :(得分:2)
纪元之前的时间戳(1月1970日1月)由负数表示。看看this SO answer看一个例子。
如果您的申请"崩溃" (无论这意味着什么),您需要了解它在数据库中的表示方式以及它是如何映射的。
答案 1 :(得分:1)
您可以使用Calendar类吗?
public class DatePrint {
public static void main(String[] argv) {
Calendar c = new GregorianCalendar(1900, 10, 11);
System.out.println(c.get(Calendar.DAY_OF_MONTH) + " "
+ c.get(Calendar.MONTH) + ", " + c.get(Calendar.YEAR) + " "
+ c.get(Calendar.ERA));
}
}
答案 2 :(得分:0)
ZonedDateTime.of(
LocalDate.of( 1969 , Month.DECEMEBER , 25 ) ,
LocalTime.NOON ,
ZoneId.of( "Africa/Tunis" )
).toInstant()
您没有提供足够的信息来诊断您的崩溃。
请注意各种数据库的日期时间功能广泛。 SQL标准几乎没有涉及日期时间处理的主题,因此几乎不需要。一些数据库的支持非常有限。任何严肃的面向企业的数据库都应该能够轻松存储过去和未来几个世纪的时刻。
使用添加到Java 8及更高版本的 java.time 类。这些类型显然是now supported in Hibernate(我不是用户)。
在内部,1970-01-01T00:00Z(1970年的第一个时刻,UTC)的时代之后的时刻表示为纳秒的计数,即正数。在纪元之前的时刻,负数为纳秒。但你不应该真的在意。只需按预期使用java.time类,永远不会看到该计数。
如果你想在1969年的新西兰圣诞节那天中午:
LocalTime lt = LocalTime.NOON ;
LocalDate ld = LocalDate.of( 1969 , Month.DECEMEBER , 25 ) ;
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
使用JDBC 4.2及更高版本,您可以直接与数据库交换这些java.time类型。不需要数字或字符串。旧的java.sql.Timestamp
及相关类现在已经遗留下来,可能会被遗忘。
将您的时刻从其时区调整为UTC,提取Instant
。同一时刻,时间轴上的同一点,但通过镜头观察特定地区人民使用的挂钟时间。
Instant instant = zdt.toInstant() ;
将TIMESTAMP WITH TIME ZONE
类型的列传递到您的数据库。
myPreparedStatement.setObject( … , instant ) ;
并检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( ZoneId.of( "America/Montreal" ) ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。