public static bool isInvalidTZTimeOnly()

in FixAntenna/NetCore/Message/FixTypes.cs [570:967]


		public static bool isInvalidTZTimeOnly(byte[] buffer, int offset, int count)
		{
			//    Example: 07:39Z is 07:39 UTC
			//    Example: 02:39-05 is five hours behind UTC, thus Eastern Time
			//    Example: 15:39+08 is eight hours ahead of UTC, Hong Kong/Singapore time
			//    Example: 13:09+05:30 is 5.5 hours ahead of UTC, India time
			try
			{
				if (count != 6 && count != 8 && count != 9 && count != 11 && count != 13 && count != 14 &&
					count != 15 && count != 16 && count != 18 && count != 19 && count != 21 && count != 24)
				{
					return true;
				}

				if (buffer[offset + 2] != (byte)':')
				{
					return true;
				}

				// hours
				var hour = ParseNumberPart(buffer, offset, offset + 2);
				if (hour < 0 || hour > 23)
				{
					return true;
				}

				// minute
				var minute = ParseNumberPart(buffer, offset + 3, offset + 5);
				if (minute < 0 || minute > 59)
				{
					return true;
				}

				if (buffer[offset + 5] != (byte)':')
				{
					// only minutes
					switch (count)
					{
						case 6:
						{
							//07:39Z
							if (buffer[offset + 5] != (byte)'Z')
							{
								return true;
							}
						}
							break;
						case 8:
						{
							//13:09+05
							if (!(buffer[offset + 5] == (byte)'+' || buffer[offset + 5] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 6, offset + 8);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}
						}
							break;
						case 11:
						{
							//07:39+02:31
							if (!(buffer[offset + 5] == (byte)'+' || buffer[offset + 5] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 6, offset + 8);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}

							if (buffer[offset + 8] != (byte)':')
							{
								return true;
							}

							var tzMinutes = ParseNumberPart(buffer, offset + 9, offset + 11);
							if (tzMinutes < 0 || tzMinutes > 59)
							{
								return true;
							}
						}
							break;
						default:
							return true;
					}
				}
				else
				{
					//as minimum seconds are present
					var second = ParseNumberPart(buffer, offset + 6, offset + 8);
					if (second < 0 || second > 60)
					{
						return true;
					}

					switch (count)
					{
						case 9:
						{
							//13:09:30Z
							if (buffer[offset + 8] != (byte)'Z')
							{
								return true;
							}
						}
							break;
						case 11:
						{
							//07:39:30+02
							if (!(buffer[offset + 8] == (byte)'+' || buffer[offset + 8] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 9, offset + 11);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}
						}
							break;
						case 13:
						{
							//07:39:30.301Z
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
							if (mills < 0 || mills > 999)
							{
								return true;
							}

							if (buffer[offset + 12] != (byte)'Z')
							{
								return true;
							}
						}
							break;
						case 14:
						{
							//07:39:33+02:31
							if (!(buffer[offset + 8] == (byte)'+' || buffer[offset + 8] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 9, offset + 11);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}

							if (buffer[offset + 11] != (byte)':')
							{
								return true;
							}

							var tzMinutes = ParseNumberPart(buffer, offset + 12, offset + 14);
							if (tzMinutes < 0 || tzMinutes > 59)
							{
								return true;
							}
						}
							break;
						case 15:
						{
							//07:39:54.101+02
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
							if (mills < 0 || mills > 999)
							{
								return true;
							}

							if (!(buffer[offset + 12] == (byte)'+' || buffer[offset + 12] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 13, offset + 15);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}
						}
							break;
						case 16:
						{
							//07:39:30.301301Z
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
							if (micros < 0 || micros > 999999)
							{
								return true;
							}

							if (buffer[offset + 15] != (byte)'Z')
							{
								return true;
							}
						}
							break;
						case 18:
						{
							//07:39:54.101+02:17
							//07:39:54.101101-02
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							if (buffer[offset + 15] == (byte)':')
							{
								//07:39:54.101+02:17
								var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
								if (mills < 0 || mills > 999)
								{
									return true;
								}

								if (!(buffer[offset + 12] == (byte)'+' || buffer[offset + 12] == (byte)'-'))
								{
									return true;
								}

								var tzHour = ParseNumberPart(buffer, offset + 13, offset + 15);
								if (tzHour < 1 || tzHour > 12)
								{
									return true;
								}

								var tzMinutes = ParseNumberPart(buffer, offset + 16, offset + 18);
								if (tzMinutes < 0 || tzMinutes > 59)
								{
									return true;
								}
							}
							else if (buffer[offset + 15] == (byte)'+' || buffer[offset + 15] == (byte)'-')
							{
								//07:39:54.101101-02
								var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
								if (micros < 0 || micros > 999999)
								{
									return true;
								}

								var tzHour = ParseNumberPart(buffer, offset + 16, offset + 18);
								if (tzHour < 1 || tzHour > 12)
								{
									return true;
								}
							}
							else
							{
								return true;
							}
						}
							break;
						case 19:
						{
							//07:39:30.301301301Z
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
							if (nanos < 0 || nanos > 999999999)
							{
								return true;
							}

							if (buffer[offset + 18] != (byte)'Z')
							{
								return true;
							}
						}
							break;
						case 21:
						{
							//07:39:54.101101+02:17
							//07:39:54.101101101-02
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							if (buffer[offset + 18] == (byte)':')
							{
								//07:39:54.101101+02:17
								var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
								if (micros < 0 || micros > 999999)
								{
									return true;
								}

								if (!(buffer[offset + 15] == (byte)'+' || buffer[offset + 15] == (byte)'-'))
								{
									return true;
								}

								var tzHour = ParseNumberPart(buffer, offset + 16, offset + 18);
								if (tzHour < 1 || tzHour > 12)
								{
									return true;
								}

								var tzMinutes = ParseNumberPart(buffer, offset + 19, offset + 21);
								if (tzMinutes < 0 || tzMinutes > 59)
								{
									return true;
								}
							}
							else if (buffer[offset + 18] == (byte)'+' || buffer[offset + 18] == (byte)'-')
							{
								//07:39:54.101101101-02
								var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
								if (nanos < 0 || nanos > 999999999)
								{
									return true;
								}

								var tzHour = ParseNumberPart(buffer, offset + 19, offset + 21);
								if (tzHour < 1 || tzHour > 12)
								{
									return true;
								}
							}
							else
							{
								return true;
							}
						}
							break;
						case 24:
						{
							//07:39:54.101101101-02:17
							if (buffer[offset + 8] != (byte)'.')
							{
								return true;
							}

							var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
							if (nanos < 0 || nanos > 999999999)
							{
								return true;
							}

							if (!(buffer[offset + 18] == (byte)'+' || buffer[offset + 18] == (byte)'-'))
							{
								return true;
							}

							var tzHour = ParseNumberPart(buffer, offset + 19, offset + 21);
							if (tzHour < 1 || tzHour > 12)
							{
								return true;
							}

							if (buffer[offset + 21] != (byte)':')
							{
								return true;
							}

							var tzMinutes = ParseNumberPart(buffer, offset + 22, offset + 24);
							if (tzMinutes < 0 || tzMinutes > 59)
							{
								return true;
							}
						}
							break;
					}
				}
			}
			catch (Exception)
			{
				return true;
			}

			return false;
		}