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