我注意到datenumMATLAB R2017a及更高版本中的函数有奇怪的行为:
如果您尝试运行:
date = datenum([""],'yyyymmdd');
Run Code Online (Sandbox Code Playgroud)
我们收到警告:
警告:不支持将DATENUM与空白的日期字符向量或空白的字符串一起使用。结果可能会在将来的版本中更改。
date =
0x1 empty double column vector
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我们运行:
date = datenum(["","20181012"],'yyyymmdd')
Run Code Online (Sandbox Code Playgroud)
我们获得:
date = 2x1:
737426 % which corresponds to 20190101
737345
Run Code Online (Sandbox Code Playgroud)
因此,两次我们都给空字符串datenum,但是如果数组包含多个字符串,结果将不同。为什么在存在其他字符串(甚至是另一个空字符串)时却不能解析空字符串,而仅在单独出现时不能解析?
这可能是一个错误。
该datenum函数的开头包含
Run Code Online (Sandbox Code Playgroud)arg1 = stringToLegacyText(arg1);
arg1的第一个输入在哪里datenum?该stringToLegacyText函数根据其代码执行以下操作:
Run Code Online (Sandbox Code Playgroud)S = STRINGTOLEGACYTEXT(S) converts the string array S to a char row vector, if S is a scalar, or to a cellstr, if S is not a scalar.
那是,
>> stringToLegacyText([""])
ans =
0×0 empty char array
>> stringToLegacyText(["" ""])
ans =
1×2 cell array
{0×0 char} {0×0 char}
>> stringToLegacyText(["" "20181012"])
ans =
1×2 cell array
{0×0 char} {'20181012'}
Run Code Online (Sandbox Code Playgroud)
稍后进行此测试:
Run Code Online (Sandbox Code Playgroud)if isdatestr && isempty(arg1) n = zeros(0,1); warning(message('MATLAB:datenum:EmptyDate')); return; end
如果arg1为空,则会产生您提到的警告。对于上面的第一种情况([""]),测试结果为true;对于第二种情况(["" ""])或第三种情况(),则测试结果为true ["" "20181012"]。因此,对于第二种或第三种情况,功能继续
Run Code Online (Sandbox Code Playgroud)n = dtstr2dtnummx(arg1,matlab.internal.datetime.cnv2icudf(arg2))
该dtstr2dtnummx函数未记录:
Run Code Online (Sandbox Code Playgroud)>> which dtstr2dtnummx built-in (undocumented)
但它希望将char向量的单元格数组作为第一个参数,并以某种方式给出737426空char向量:
>> dtstr2dtnummx({''}, matlab.internal.datetime.cnv2icudf(arg2))
ans =
737426
>> dtstr2dtnummx({'' ''}, matlab.internal.datetime.cnv2icudf(arg2))
ans =
737426
737426
>> dtstr2dtnummx({'' '20181012'}, matlab.internal.datetime.cnv2icudf(arg2))
ans =
737426
737345
Run Code Online (Sandbox Code Playgroud)