private static DateTimeOffset parseTZTimeOnlyPart()

in FixAntenna/NetCore/Message/FixTypes.cs [1525:1600]


		private static DateTimeOffset parseTZTimeOnlyPart(byte[] buffer, int offset, int length)
		{
			var hour = ParseNumberPart(buffer, offset, offset + 2);
			if (hour < 0 || hour > 23)
			{
				throw new ArgumentException();
			}

			// Starting from year 2 to prevent ArgumentOutOfRangeException in case when current time inside offset.
			var timeBuilder = new DateTimeBuilder(2, 1, 1);
			timeBuilder = timeBuilder.SetHour(hour);
			var minute = ParseNumberPart(buffer, offset + 3, offset + 5);
			if (minute < 0 || minute > 59)
			{
				throw new ArgumentException();
			}

			timeBuilder = timeBuilder.SetMinute(minute);
			var timeZoneLength = length - 5;

			if (length > 5 && buffer[offset + 5] == (byte)':')
			{
				// seconds
				var seconds = ParseNumberPart(buffer, offset + 6, offset + 8);
				if (seconds < 0 || seconds > 60)
				{
					throw new ArgumentException();
				}

				timeBuilder = timeBuilder.SetSecond(seconds);
				timeZoneLength -= 3;

				if (length > 8 && buffer[offset + 8] == (byte)'.' && length + offset > 5)
				{
					// milliseconds
					var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
					if (mills < 0 || mills > 999)
					{
						throw new ArgumentException();
					}

					timeBuilder = timeBuilder.SetMillisecond(mills);
					timeZoneLength -= 4;

					var fractionsCount = 3; // as minimum milliseconds are present
					for (var i = 12; i < length; i++)
					{
						if (buffer[offset + i] >= (byte)'0' && buffer[offset + i] <= (byte)'9')
						{
							fractionsCount++;
						}
						else
						{
							break;
						}
					}

					if (fractionsCount == 6)
					{
						timeZoneLength -= 3;
					}
					else if (fractionsCount == 9)
					{
						timeZoneLength -= 6;
					}
					else if (fractionsCount != 3)
					{
						throw new ArgumentException("Invalid count of second fractions");
					}
				}
			}

			var tzStartPosition = offset + length - timeZoneLength;
			var timeZoneOffset = DateTimeHelper.ParseZoneOffset(buffer, tzStartPosition, timeZoneLength);
			return timeBuilder.Build(timeZoneOffset);
		}