我正在尝试timestamp
在我的 Android 应用程序中使用 Access 2003 数据库中的一个。通过网络服务器,我得到一个long
日期字段,其字段大小为“长整数”,格式为“日期,短”。
长的看起来像:41574
如何将此 long 转换为可以与Date
Java/Android 中的类一起使用的日期/long?
“滚动你自己的”程序来操纵日期等事物的内部表示可能是有风险的。Eric Lippert在这里写了一篇优秀的博客文章,专门与 Access(以及 VBA 和 VBScript)使用的日期格式相关。
最好的解决方案是修复 Web 服务,使其传递一个实际明确的日期值,例如yyyy-mm-dd
. 但是,如果那是不可能的,那么我将倾向于使用以下内容:
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class dateTestMain {
public static void main(String[] args) {
long accessDateNumberToTest;
for (accessDateNumberToTest = -2; accessDateNumberToTest <= 2; accessDateNumberToTest++) {
long ms_since_1970_01_01 = (accessDateNumberToTest - 25569) * 86400000;
java.util.Date utcDate = new java.util.Date(ms_since_1970_01_01);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// dump date to string as UTC...
sdf.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
String utcDateString = sdf.format(utcDate);
// ...and parse back to Date in local timezone
sdf.setTimeZone(java.util.TimeZone.getDefault());
java.util.Date jDate = null;
try {
jDate = sdf.parse(utcDateString);
System.out.println(String.format("Java test: %s maps to %s", accessDateNumberToTest, jDate));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
上面代码中的for
循环只是测试访问日期“数字”的范围,以验证转换是否能正确处理从负到正的转换。Java代码返回以下...
Java test: -2 maps to Thu Dec 28 00:00:00 EST 1899
Java test: -1 maps to Fri Dec 29 00:00:00 EST 1899
Java test: 0 maps to Sat Dec 30 00:00:00 EST 1899
Java test: 1 maps to Sun Dec 31 00:00:00 EST 1899
Java test: 2 maps to Mon Jan 01 00:00:00 EST 1900
...并且使用 Access VBA 测试CDate(num)
似乎同意
Access VBA test: -2 maps to 1899-12-28 00:00:00
Access VBA test: -1 maps to 1899-12-29 00:00:00
Access VBA test: 0 maps to 1899-12-30 00:00:00
Access VBA test: 1 maps to 1899-12-31 00:00:00
Access VBA test: 2 maps to 1900-01-01 00:00:00
此外,与 Excel 电子表格单元格中格式化为日期的数字不同,数字 60 不会映射到1900-02-29
. (这不是一个有效的日期,因为 1900 年不是闰年。Excel 中的行为是早期 Lotus 1-2-3 错误的遗留问题。)Java 结果再次......
Java test: 58 maps to Mon Feb 26 00:00:00 EST 1900
Java test: 59 maps to Tue Feb 27 00:00:00 EST 1900
Java test: 60 maps to Wed Feb 28 00:00:00 EST 1900
Java test: 61 maps to Thu Mar 01 00:00:00 EST 1900
Java test: 62 maps to Fri Mar 02 00:00:00 EST 1900
...同意 Access VBA 测试:
Access VBA test: 58 maps to 1900-02-26 00:00:00
Access VBA test: 59 maps to 1900-02-27 00:00:00
Access VBA test: 60 maps to 1900-02-28 00:00:00
Access VBA test: 61 maps to 1900-03-01 00:00:00
Access VBA test: 62 maps to 1900-03-02 00:00:00