【问题标题】:Convert SAS date value to Java YYYY-MM-DD将 SAS 日期值转换为 Java YYYY-MM-DD
【发布时间】:2015-05-19 16:27:53
【问题描述】:

我将 SAS 日期对象存储为整数,它们看起来像:19725。 我正在尝试编写java代码将日期转换为YYYY-MM-DD 我在文档中看到 SAS 日期值是从 1960 年 1 月 1 日开始的天数 例如:

02 Jan 1960 将返回 1 2003 年 6 月 4 日将返回 15680

你能给出这个转换的java代码吗? IE。将 19725 之类的内容转换为日期格式:YYYY-MM-DD

我尝试下面的逻辑,但 15680 给出 2003-01-06 而不是 2003-06-04 作为输出。谁能指出错误。提前谢谢。

int numdays = 15680;    
Calendar cal = Calendar.getInstance();    
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, 1);
    cal.set(Calendar.YEAR, 1960);
    cal.add(Calendar.DAY_OF_MONTH, numdays);

    String strdate = null;

    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD");

    if (cal != null) {
    strdate = sdf.format(cal.getTime());
    }
    System.out.println(strdate);

【问题讨论】:

  • 在 SAS 中,我知道 15680 实际上是 2002-12-06。执行data _null_; x = 15680; put x e8601da.; run; 将向您展示根据 SAS 应该是什么。
  • 可运行演示:ideone.com/S6J0ba

标签: java date datetime sas


【解决方案1】:

月份是0-based,因此您将日历设置为二月,而不是一月。这应该可以解决问题:

Calendar cal = Calendar.getInstance();    
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, Calendar.JANUARY);
// ...

【讨论】:

  • 谢谢@RC!它没有帮助。 Changign Month to zero (for January) 给我 2002-12-340。还有其他事情搞砸了,我无法弄清楚。
  • 340 对于该日期的天数是正确的(12 月 6 日是从年底开始的 25 天 - 365 - 所以第 340 天)。您只需要“一个月中的某天”('dd')而不是“一年中的某天”('DD')。
【解决方案2】:

除了 RC 关于以 Calendar.JANUARY 正确开始月份的观点之外,您的 simpledateformat 是错误的。

SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");

'DD' 是一年中的某一天(因此一年中的第 340 天是 12 月 6 日)。 'dd' 是一个月中的某一天。有关更多详细信息,请参阅the doc。 (另请注意,15680 是 2002 年 12 月 6 日,而不是您在问题中所说的。)

您实际上可能还想使用'yy'

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

因为'YYYY' 是“周年”,在某些情况下可能与接近年底的yyyy(日历年)不同。详情请见the docs

【讨论】:

    【解决方案3】:

    我喜欢使用 JodaTime 进行这样的日期操作。

    http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#plusDays-int-

    int sasDate = 19725;
    DateTime base = new DateTime(1960, 1, 1, 0, 0);
    DateTime computed = base.plusDays(sasDate);
    

    【讨论】:

    • 关闭,但您应该指定一个时区。可能是UTC。否则你的 JVM 的当前默认时区将被隐式应用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多