为何SAS EG与SAS DI中FINFO函数返回的字符串格式不同?
这是个非常典型的SAS跨环境差异问题,我来给你理清楚根源:
核心原因:系统区域设置(Locale)的差异
finfo函数获取的文件修改时间,本质上是直接调用了操作系统的文件系统API返回的结果,SAS只是把这个结果原封不动地返回给你。而不同环境下的系统区域设置,会让API返回的日期时间字符串格式完全不同:
SAS EG(Enterprise Guide):作为桌面客户端,它运行在你的本地Windows系统上,默认会采用Windows系统的区域设置。大多数桌面环境的区域设置会使用缩写月份名称(比如
Jan、Feb),并且日期和时间之间用冒号分隔,所以返回的格式是12Jan2023:11:03:53。你之前用datetime20.转换报错,是因为datetime20.的标准格式是DDMMMYYYY HH:MM:SS(日期和时间用空格分隔),而EG返回的是冒号分隔,格式不匹配导致的。SAS DI(Data Integration):DI通常是部署在服务器端运行的(不管是Windows Server还是Linux/Unix),服务器的区域设置一般会配置为使用完整月份名称(比如
January、February),日期和时间之间用空格分隔,所以返回的格式是12 January 2023 11:03:28。这种格式和datetime.系列informat的兼容性更好,所以你在DI里转换不会报错。
通用解决方法(兼容两种格式)
如果想写一套代码在两个环境都能用,推荐使用SAS的anydtdtm. informat,它能自动识别绝大多数常见的日期时间格式:
moddate = input(finfo(fid,'Last Modified'), anydtdtm30.); format moddate datetime20.;
这个informat会自动适配缩写/完整月份、不同的分隔符,不用单独针对EG或DI写分支代码。
内容的提问来源于stack exchange,提问作者Dvlpr

