public static DateTime parseUTC(String utcString) {
		if (utcString == null) {
			return null;
		}
		final int length = utcString.length();
		if (StrUtil.contains(utcString, 'Z')) {
			if (length == DatePattern.UTC_PATTERN.length() - 4) {
				// 格式类似：2018-09-13T05:34:31Z，-4表示减去4个单引号的长度
				return parse(utcString, DatePattern.UTC_FORMAT);
			}

			final int patternLength = DatePattern.UTC_MS_PATTERN.length();
			// 格式类似：2018-09-13T05:34:31.999Z，-4表示减去4个单引号的长度
			// -4 ~ -6范围表示匹配毫秒1~3位的情况
			if (length <= patternLength && length >= patternLength - 6) {
				// issue#I7H34N，支持最多6位毫秒
				return parse(utcString, DatePattern.UTC_MS_FORMAT);
			}
		} else if (StrUtil.contains(utcString, '+')) {
			// 去除类似2019-06-01T19:45:43 +08:00加号前的空格
			utcString = utcString.replace(" +", "+");
			final String zoneOffset = StrUtil.subAfter(utcString, '+', true);
			if (StrUtil.isBlank(zoneOffset)) {
				throw new DateException("Invalid format: [{}]", utcString);
			}
			if (false == StrUtil.contains(zoneOffset, ':')) {
				// +0800转换为+08:00
				final String pre = StrUtil.subBefore(utcString, '+', true);
				utcString = pre + "+" + zoneOffset.substring(0, 2) + ":" + "00";
			}

			if (StrUtil.contains(utcString, CharUtil.DOT)) {
				// 带毫秒，格式类似：2018-09-13T05:34:31.999+08:00
				utcString = normalizeMillSeconds(utcString, ".", "+");
				return parse(utcString, DatePattern.UTC_MS_WITH_XXX_OFFSET_FORMAT);
			} else {
				// 格式类似：2018-09-13T05:34:31+08:00
				return parse(utcString, DatePattern.UTC_WITH_XXX_OFFSET_FORMAT);
			}
		} else if(ReUtil.contains("-\\d{2}:?00", utcString)){
			// Issue#2612，类似 2022-09-14T23:59:00-08:00 或者 2022-09-14T23:59:00-0800

			// 去除类似2019-06-01T19:45:43 -08:00加号前的空格
			utcString = utcString.replace(" -", "-");
			if(':' != utcString.charAt(utcString.length() - 3)){
				utcString = utcString.substring(0, utcString.length() - 2) + ":00";
			}

			if (StrUtil.contains(utcString, CharUtil.DOT)) {
				// 带毫秒，格式类似：2018-09-13T05:34:31.999-08:00
				utcString = normalizeMillSeconds(utcString, ".", "-");
				return new DateTime(utcString, DatePattern.UTC_MS_WITH_XXX_OFFSET_FORMAT);
			} else {
				// 格式类似：2018-09-13T05:34:31-08:00
				return new DateTime(utcString, DatePattern.UTC_WITH_XXX_OFFSET_FORMAT);
			}
		} else {
			if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) {
				// 格式类似：2018-09-13T05:34:31
				return parse(utcString, DatePattern.UTC_SIMPLE_FORMAT);
			} else if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 5) {
				// 格式类似：2018-09-13T05:34
				return parse(utcString + ":00", DatePattern.UTC_SIMPLE_FORMAT);
			} else if (StrUtil.contains(utcString, CharUtil.DOT)) {
				// 可能为：  2021-03-17T06:31:33.99
				utcString = normalizeMillSeconds(utcString, ".", null);
				return parse(utcString, DatePattern.UTC_SIMPLE_MS_FORMAT);
			}
		}
		// 没有更多匹配的时间格式
		throw new DateException("No format fit for date String [{}] !", utcString);
	}
@Test
	public void parseUTCTest2() {
		// issue1503@Github
		// 检查不同毫秒长度都可以正常匹配
		String utcTime = "2021-03-30T12:56:51.3Z";
		DateTime parse = DateUtil.parseUTC(utcTime);
		assertEquals("2021-03-30 12:56:51", parse.toString());

		utcTime = "2021-03-30T12:56:51.34Z";
		parse = DateUtil.parseUTC(utcTime);
		assertEquals("2021-03-30 12:56:51", parse.toString());

		utcTime = "2021-03-30T12:56:51.345Z";
		parse = DateUtil.parseUTC(utcTime);
		assertEquals("2021-03-30 12:56:51", parse.toString());
	}