DateTimeFormatValidator
Validator for DateTime format.
using Newtonsoft.Json.Linq;
using System;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
namespace NJsonSchema.Validation.FormatValidators
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public class DateTimeFormatValidator : IFormatValidator
{
private readonly string[] _acceptableFormats = new string[15] {
"yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK",
"yyyy-MM-dd' 'HH:mm:ss.FFFFFFFK",
"yyyy-MM-dd'T'HH:mm:ssK",
"yyyy-MM-dd' 'HH:mm:ssK",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd' 'HH:mm:ss",
"yyyy-MM-dd'T'HH:mm",
"yyyy-MM-dd' 'HH:mm",
"yyyy-MM-dd'T'HH",
"yyyy-MM-dd' 'HH",
"yyyy-MM-dd",
"yyyy-MM-dd'Z'",
"yyyyMMdd",
"yyyy-MM",
"yyyy"
};
private static readonly Regex DateTimeRegexPattern = new Regex("^((?:(\\d{4}-\\d{2}-\\d{2})([Tt_]| )(\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?))([Zz]|[\\+-]\\d{2}:\\d{2}))$", RegexOptions.Compiled, TimeSpan.FromMilliseconds(250));
public string Format { get; } = "date-time";
public ValidationErrorKind ValidationErrorKind { get; } = ValidationErrorKind.DateTimeExpected;
public bool IsValid(string value, JTokenType tokenType)
{
if (tokenType != JTokenType.Date && !DateTimeOffset.TryParseExact(value, _acceptableFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTimeOffset _))
return DateTimeRegexPattern.IsMatch(value);
return true;
}
}
}