diff --git a/NEWS.md b/NEWS.md index 825b14c3..cb41ef80 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # haven (development version) +* `read_sas()` and `read_xpt()` now supports all datetime, date and time + formats (#780) and correctly recognises DATEAMPM as datetime (#789). + * Fix bug that caused `write_xpt()` to fail when writing tagged `NA` values (#755). * Tagged `NA` values are now silently converted to lower case when they are diff --git a/src/haven_types.cpp b/src/haven_types.cpp index f71fc5f7..3b10c983 100644 --- a/src/haven_types.cpp +++ b/src/haven_types.cpp @@ -53,22 +53,59 @@ VarType numType(FileVendor vendor, const char* var_format) { case HAVEN_SAS: // http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000589916.htm if (hasPrefix(format,"DATETIME")) return HAVEN_DATETIME; + else if (hasPrefix(format,"DT")) return HAVEN_DATETIME; + else if (hasPrefix(format,"DATEAMPM")) return HAVEN_DATETIME; + else if (hasPrefix(format,"MDYAMPM")) return HAVEN_DATETIME; + else if (hasPrefix(format,"NLDATMT")) return HAVEN_DATETIME; + else if (hasPrefix(format,"NLDATM")) return HAVEN_DATETIME; + else if (hasPrefix(format,"IS8601DN")) return HAVEN_DATETIME; else if (hasPrefix(format,"IS8601DT")) return HAVEN_DATETIME; - else if (hasPrefix(format,"E8601DT")) return HAVEN_DATETIME; + else if (hasPrefix(format,"IS8601DZ")) return HAVEN_DATETIME; + else if (hasPrefix(format,"B8601DN")) return HAVEN_DATETIME; else if (hasPrefix(format,"B8601DT")) return HAVEN_DATETIME; + else if (hasPrefix(format,"B8601DX")) return HAVEN_DATETIME; + else if (hasPrefix(format,"B8601DZ")) return HAVEN_DATETIME; + else if (hasPrefix(format,"B8601LX")) return HAVEN_DATETIME; + else if (hasPrefix(format,"E8601DN")) return HAVEN_DATETIME; + else if (hasPrefix(format,"E8601DT")) return HAVEN_DATETIME; + else if (hasPrefix(format,"E8601DX")) return HAVEN_DATETIME; + else if (hasPrefix(format,"E8601DZ")) return HAVEN_DATETIME; + else if (hasPrefix(format,"E8601LX")) return HAVEN_DATETIME; + else if (hasPrefix(format,"DATE")) return HAVEN_DATE; + else if (hasPrefix(format,"NLDATE")) return HAVEN_DATE; + else if (hasPrefix(format,"DOWNAME")) return HAVEN_DATE; else if (hasPrefix(format,"IS8601DA")) return HAVEN_DATE; - else if (hasPrefix(format,"E8601DA")) return HAVEN_DATE; else if (hasPrefix(format,"B8601DA")) return HAVEN_DATE; - else if (hasPrefix(format,"WEEKDATE")) return HAVEN_DATE; + else if (hasPrefix(format,"E8601DA")) return HAVEN_DATE; + else if (hasPrefix(format,"DAY")) return HAVEN_DATE; + else if (hasPrefix(format,"WEEK")) return HAVEN_DATE; + else if (hasPrefix(format,"MON")) return HAVEN_DATE; + else if (hasPrefix(format,"QTR")) return HAVEN_DATE; + else if (hasPrefix(format,"YEAR")) return HAVEN_DATE; else if (hasPrefix(format,"MMDDYY")) return HAVEN_DATE; else if (hasPrefix(format,"DDMMYY")) return HAVEN_DATE; else if (hasPrefix(format,"YYMMDD")) return HAVEN_DATE; - else if (hasPrefix(format,"DATE")) return HAVEN_DATE; + else if (hasPrefix(format,"MMYY")) return HAVEN_DATE; + else if (hasPrefix(format,"YYMM")) return HAVEN_DATE; + else if (hasPrefix(format,"YY")) return HAVEN_DATE; + else if (hasPrefix(format,"WORDDAT")) return HAVEN_DATE; + else if (hasPrefix(format,"NENGO")) return HAVEN_DATE; + else if (hasPrefix(format,"JULIAN")) return HAVEN_DATE; + else if (hasPrefix(format,"JULDAY")) return HAVEN_DATE; + else if (hasPrefix(format,"PDJULG")) return HAVEN_DATE; + else if (hasPrefix(format,"PDJULI")) return HAVEN_DATE; else if (hasPrefix(format,"TIME")) return HAVEN_TIME; + else if (hasPrefix(format,"TIMEAMPM")) return HAVEN_TIME; + else if (hasPrefix(format,"NLTIM")) return HAVEN_TIME; + else if (hasPrefix(format,"TOD")) return HAVEN_TIME; + else if (hasPrefix(format,"HOUR")) return HAVEN_TIME; else if (hasPrefix(format,"HHMM")) return HAVEN_TIME; - else if (hasPrefix(format,"IS8601TM")) return HAVEN_TIME; - else if (hasPrefix(format,"E8601TM")) return HAVEN_TIME; - else if (hasPrefix(format,"B8601TM")) return HAVEN_TIME; + else if (hasPrefix(format,"MMSS")) return HAVEN_TIME; + else if (hasPrefix(format,"IS8601T")) return HAVEN_TIME; + else if (hasPrefix(format,"B8601T")) return HAVEN_TIME; + else if (hasPrefix(format,"B8601LZ")) return HAVEN_TIME; + else if (hasPrefix(format,"E8601T")) return HAVEN_TIME; + else if (hasPrefix(format,"E8601LZ")) return HAVEN_TIME; else return HAVEN_DEFAULT; case HAVEN_SPSS: // http://www-01.ibm.com/support/knowledgecenter/?lang=en#!/SSLVMB_20.0.0/com.ibm.spss.statistics.help/syn_date_and_time_date_time_formats.htm