繁体   English   中英

将Access 2003日期数字(整数)转换为Java日期

[英]Convert Access 2003 date number (integer) to Java Date

我正在尝试在我的Android应用程序中使用Access 2003数据库中的timestamp 通过网络服务器,我得到了long的日期字段,其字段大小是“长整数”,格式是“日期,短”。

长的样子: 41574

如何将这个long转换为可以与Java / Android中的Date类一起使用的date / 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

...并且使用CDate(num)的Access VBA测试似乎同意

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年不是a年。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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM