正确处理时间
来源:互联网 发布:怎么用软件解三键 编辑:程序博客网 时间:2024/06/11 14:18
日期和时间在程序中应用广泛,很多开发者把本地时间存入数据库中。但是,一旦涉及到跨时区的日期和时间的处理时,大多数开发者根本就不明白如何正确地处理日期和时间。
Date date = new Date();
save(date);
这么做的问题在于,数据库的DateTime类型没有时区(time zone)信息,因此,存入的是本地时间,并且丢掉了时区信息。如果你把数据库服务器的时区改了,或者把应用服务器的时区改了,读出来的日期和时间就是错误的。如果以Timestamp类型存储,各数据库的实现也不相同,有的进行了内部时区自动转换,而且,存储的时间不超过2037年。
时区的概念
之所以有时区的概念是因为住在地球上不同地方的人看到太阳升起的时间是不一样的。我们假设北京人民在早上8:00看到了太阳刚刚升起,而此刻欧洲人民还在夜里,他们还需要再过7个小时才能看到太阳升起,所以,此刻欧洲人民的手表上显示的是凌晨1:00。如果你强迫他们用北京时间那他们每天看到日出的时间就是下午3点。
也就是说,东8区的北京人民的手表显示的8:00和东1区欧洲人民手表显示的1:00是相同的时刻:
"2014-10-14 08:00 +8:00" = "2014-10-14 01:00 +1:00"
这就是本地时间的概念。
正确的存储方式
把表示绝对时间的时间戳(无论是Long型还是Float)存入数据库,在显示的时候根据用户设置的时区格式化为正确的字符串。
// Java:
long t = System.currentTimeMillis();
System.out.println("long = " + t);
// current time zone:
SimpleDateFormat sdf_default = new SimpleDateFormat("yyyy-MM-dd HH:mm");
System.out.println(sdf_default.format(t));
// +8:00 time zone:
SimpleDateFormat sdf_8 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
sdf_8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
System.out.println("GMT+8:00 = " + sdf_8.format(t));
// +7:00 time zone:
SimpleDateFormat sdf_7 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
sdf_7.setTimeZone(TimeZone.getTimeZone("GMT+7:00"));
System.out.println("GMT+7:00 = " + sdf_7.format(t));s
0 0
- 正确处理时间
- 如何正确处理时间
- java.util.Calendar不能正确处理中国标准时间的"1900-01-01 08:00:00 000"
- web应用正确处理中文
- 正确处理字符编码
- 正确处理SqlCeException的方法
- 正确处理字符编码
- 正确处理字符编码
- Linux中正确处理errno
- 正确处理Windows电源事件
- 正确处理 SqlCe 异常
- 正确处理Ordered Broadcasts
- 正确处理 Memory Warning
- 正确处理 Memory Warning
- 正确处理 Memory Warning
- 正确处理Windows电源事件
- 正确处理 Memory Warning
- 正确处理 Azure OnStop 事件
- 【MyBatis框架】SqlMapConfig剖析
- C#使用OleDB操作ACCESS插入数据时提示:参数 @p_Contract 没有默认值
- C#使用OleDB操作ACCESS插入数据时提示:至少一个参数没有被指定值。
- 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。
- 在 System.Data.OleDb.OleDbException 中第一次偶然出现的“System.Data.dll”类型的异常
- 正确处理时间
- 先看一下 NSArray 是怎么传递 block 参数的
- IOS7之后控制TableViewSeparateView的宽度
- java中的堆、栈、常量池
- C++ I/O
- 分支和循环(1)
- 企业服务是移动互联网的下一个风口
- (2)工厂方法模式
- 学习笔记(objective-c)-多态