空字符串串联的Datenum行为

obc*_*don 6 matlab date

我注意到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,但是如果数组包含多个字符串,结果将不同。为什么在存在其他字符串(甚至是另一个空字符串)时却不能解析空字符串,而仅在单独出现时不能解析?

Lui*_*ndo 5

这可能是一个错误。

datenum函数的开头包含

arg1 = stringToLegacyText(arg1);
Run Code Online (Sandbox Code Playgroud)

arg1的第一个输入在哪里datenum?该stringToLegacyText函数根据其代码执行以下操作:

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.
Run Code Online (Sandbox Code Playgroud)

那是,

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

稍后进行此测试:

if isdatestr && isempty(arg1)
   n = zeros(0,1);
   warning(message('MATLAB:datenum:EmptyDate'));
   return;
end
Run Code Online (Sandbox Code Playgroud)

如果arg1为空,则会产生您提到的警告。对于上面的第一种情况([""]),测试结果为true;对于第二种情况(["" ""])或第三种情况(),则测试结果为true ["" "20181012"]。因此,对于第二种或第三种情况,功能继续

n = dtstr2dtnummx(arg1,matlab.internal.datetime.cnv2icudf(arg2))
Run Code Online (Sandbox Code Playgroud)

dtstr2dtnummx函数未记录:

>> which dtstr2dtnummx
built-in (undocumented)
Run Code Online (Sandbox Code Playgroud)

但它希望将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)