Мне удалось посмотреть, как datenum
анализирует свои входные аргументы в R2018a, набрав edit datenum
. Первое, что он делает, это передает первый аргумент функции stringToLegacyText
, которая преобразует его из строкового типа в массив символов или (и это ключ) массив ячеек массивов символов :
>> import matlab.internal.datatypes.stringToLegacyText % Get helper function
>> stringToLegacyText([""]) % Single empty string
ans =
0×0 empty char array
>> stringToLegacyText(["", "20181012"]) % Array of strings
ans =
1×2 cell array
{0×0 char} {'20181012'}
Некоторое время спустя в коде выполняется эта проверка:
if isdatestr && isempty(arg1)
n = zeros(0,1);
warning(message('MATLAB:datenum:EmptyDate'));
return;
end
И здесь возникает несоответствие. Функция isempty
возвращает true
для пустого массива символов (выдает предупреждение), но возвращает false для непустого массива ячеек, даже если этот массив ячеек содержит все пустые объекты. По какой-то причине пустые записи по умолчанию равны 1 января ст , 2019:
>> datestr(737426)
ans =
'01-Jan-2019'
Я думаю, что правильным решением здесь было бы обновить условие проверки массива ячеек с помощью любых пустых записей:
if isdatestr && (isempty(arg1) || (iscell(arg1) && any(cellfun('isempty', arg1))))
n = zeros(0,1);
warning(message('MATLAB:datenum:EmptyDate'));
return;
end