将 SAS 日期值转换为 Java YYYY-MM-DD

Convert SAS date value to Java YYYY-MM-DD

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

1960 年 1 月 2 日将 return 1 2003 年 6 月 4 日 return 15680

您能否提供此转换的 java 代码。 IE。将类似 19725 的内容转换为日期格式:YYYY-MM-DD

我尝试了下面的逻辑,但是 15680 给出了 2003-01-06 而不是 2003-06-04 作为输出。谁能提前点mistake.Thanks

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);

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

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

除了 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' 是 "Week Year",在某些情况下可能与接近年底的 yyyy(日历年)不同。有关详细信息,请参阅 the docs

我喜欢使用 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);