Недостаточно просто искать Ms, Ds и Ys в коде числового формата
[Red]#,##0 ;[Yellow](#,##0)
- это совершенно правильный числовой формат, который содержит Y и D, но неформат даты.Я специально проверяю любой из стандартных символов форматирования даты / времени ('y', 'm', 'd', 'H', 'i', 's'), которые находятся вне квадратных скобок ('[' ']«).Уже тогда я обнаружил, что проскальзывает несколько ложных срабатываний, в основном связанных с бухгалтерским и валютным форматами.Поскольку они обычно начинаются либо с подчеркивания ('_'), либо с пробела, за которым следует ноль ('0') (с которым я никогда не сталкивался в формате даты, я явно фильтрую эти значения.
Часть моего (PHP) кода для определения, является ли маска формата датой или нет:
private static $possibleDateFormatCharacters = 'ymdHis';
// Typically number, currency or accounting (or occasionally fraction) formats
if ((substr($pFormatCode,0,1) == '_') || (substr($pFormatCode,0,2) == '0 ')) {
return false;
}
// Try checking for any of the date formatting characters that don't appear within square braces
if (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i',$pFormatCode)) {
return true;
}
// No date...
return false;
Я уверен, что все еще могут быть исключения, которые я пропускаю, но (еслиитак) они, вероятно, крайние случаи