首页 > 解决方案 > 具有空字符串连接的 Datenum 行为

问题描述

我注意到datenum使用 MATLAB R2017a 及更高版本的函数有奇怪的行为:

如果您尝试运行:

date = datenum([""],'yyyymmdd');

我们得到一个警告:

警告:不支持将 DATENUM 与空日期字符向量或空字符串一起使用。结果可能会在未来的版本中发生变化。

date = 
      0x1 empty double column vector

但是现在如果我们运行:

date = datenum(["","20181012"],'yyyymmdd')

我们获得:

date = 2x1:
          737426 % which corresponds to 20190101
          737345

所以这两次我们都给 一个空字符串datenum,但是如果数组包含多个字符串,结果是不同的。为什么在存在其他字符串时可以解析空字符串,即使是另一个空字符串,但不能单独解析?

标签: matlabdate

解决方案


这可能是一个错误。

函数的开头datenum包含

arg1 = stringToLegacyText(arg1);

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.

那是,

>> 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'}

后来有这个测试:

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

arg1如果为空,则会产生您提到的警告。上述第一种情况 ( [""]) 的测试结果为真,但对第二种 ( ["" ""]) 或第三种 ( )则不然["" "20181012"]。所以对于第二种或第三种情况,函数继续

n = dtstr2dtnummx(arg1,matlab.internal.datetime.cnv2icudf(arg2))

dtstr2dtnummx功能未记录:

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

推荐阅读