private bool ParseDate()

in src/Elastic.Apm/Libraries/Newtonsoft.Json/Utilities/DateTimeParser.cs [105:157]


		private bool ParseDate(int start) => Parse4Digit(start, out Year)
			&& 1 <= Year
			&& ParseChar(start + Lzyyyy, '-')
			&& Parse2Digit(start + Lzyyyy_, out Month)
			&& 1 <= Month
			&& Month <= 12
			&& ParseChar(start + Lzyyyy_MM, '-')
			&& Parse2Digit(start + Lzyyyy_MM_, out Day)
			&& 1 <= Day
			&& Day <= DateTime.DaysInMonth(Year, Month);

		private bool ParseTimeAndZoneAndWhitespace(int start) => ParseTime(ref start) && ParseZone(start);

		private bool ParseTime(ref int start)
		{
			if (!(Parse2Digit(start, out Hour)
				&& Hour <= 24
				&& ParseChar(start + LzHH, ':')
				&& Parse2Digit(start + LzHH_, out Minute)
				&& Minute < 60
				&& ParseChar(start + LzHH_mm, ':')
				&& Parse2Digit(start + LzHH_mm_, out Second)
				&& Second < 60
				&& (Hour != 24 || Minute == 0 && Second == 0))) // hour can be 24 if minute/second is zero)
				return false;

			start += LzHH_mm_ss;
			if (ParseChar(start, '.'))
			{
				Fraction = 0;
				var numberOfDigits = 0;

				while (++start < _end && numberOfDigits < MaxFractionDigits)
				{
					var digit = _text[start] - '0';
					if (digit < 0 || digit > 9) break;

					Fraction = Fraction * 10 + digit;

					numberOfDigits++;
				}

				if (numberOfDigits < MaxFractionDigits)
				{
					if (numberOfDigits == 0) return false;

					Fraction *= Power10[MaxFractionDigits - numberOfDigits];
				}

				if (Hour == 24 && Fraction != 0) return false;
			}
			return true;
		}