Java 对于 yyyy-MM-dd'T'HH:mm:ss'Z' 时间转换问题
初始化 SimpleDateFormat 格式以及 时区:
1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 2 sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
针对不同时间格式,首先可以先初始化好所有格式:
1 static { 2 3 /* Create Date Formats */ 4 final String[] possibleDateFormats = { 5 /* RFC 1123 with 2-digit Year */"EEE, dd MMM yy HH:mm:ss z", 6 /* RFC 1123 with 4-digit Year */"EEE, dd MMM yyyy HH:mm:ss z", 7 /* RFC 1123 with no Timezone */"EEE, dd MMM yy HH:mm:ss", 8 /* Variant of RFC 1123 */"EEE, MMM dd yy HH:mm:ss", 9 /* RFC 1123 with no Seconds */"EEE, dd MMM yy HH:mm z", 10 /* Variant of RFC 1123 */"EEE dd MMM yyyy HH:mm:ss", 11 /* RFC 1123 with no Day */"dd MMM yy HH:mm:ss z", 12 /* RFC 1123 with no Day or Seconds */"dd MMM yy HH:mm z", 13 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ssZ", 14 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss'Z'", 15 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:sszzzz", 16 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss z", 17 /* ISO 8601 */"yyyy-MM-dd'T'HH:mm:ssz", 18 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss.SSSz", 19 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HHmmss.SSSz", 20 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss", 21 /* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mmZ", 22 /* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mm'Z'", 23 /* RFC 1123 without Day Name */"dd MMM yyyy HH:mm:ss z", 24 /* RFC 1123 without Day Name and Seconds */"dd MMM yyyy HH:mm z", 25 /* Simple Date Format */"yyyy-MM-dd", 26 /* Simple Date Format */"MMM dd, yyyy"}; 27 28 /* Create the dateformats */ 29 CUSTOM_DATE_FORMATS = new SimpleDateFormat[possibleDateFormats.length]; 30 31 for (int i = 0; i < possibleDateFormats.length; i++) { 32 CUSTOM_DATE_FORMATS[i] = new SimpleDateFormat(possibleDateFormats[i], Locale.getDefault()); 33 CUSTOM_DATE_FORMATS[i].setTimeZone(TIMEZONE); 34 } 35 }
之后就可以尝试转换成Date对象:
1 /* Try to parse the date */ 2 int i = 0; 3 while (i < CUSTOM_DATE_FORMATS.length) { 4 try { 10 synchronized (CUSTOM_DATE_FORMATS[i]) { 11 return CUSTOM_DATE_FORMATS[i].parse(strdate); 12 } 13 } catch (ParseException e) { 14 i++; 15 } catch (NumberFormatException e) { 16 i++; 17 } 18 }
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class DateUtils { 2 3 /** 4 * 1 Day in Millis 5 */ 6 public static final long DAY = 24L * 60L * 60L * 1000L; 7 8 /** 9 * 1 Week in Millis 10 */ 11 public static final long WEEK = 7 * DAY; 12 13 /* An array of custom date formats */ 14 private static final DateFormat[] CUSTOM_DATE_FORMATS; 15 16 /* The Default Timezone to be used */ 17 private static final TimeZone TIMEZONE = TimeZone.getDefault(); //$NON-NLS-1$ 18 19 /** 20 * Tries different date formats to parse against the given string 21 * representation to retrieve a valid Date object. 22 * 23 * @param strdate Date as String 24 * @return Date The parsed Date 25 */ 26 public static Date parseDate(String strdate) { 27 28 /* Return in case the string date is not set */ 29 if (strdate == null || strdate.length() == 0) return null; 30 31 Date result = null; 32 strdate = strdate.trim(); 33 if (strdate.length() > 10) { 34 35 /* Open: deal with +4:00 (no zero before hour) */ 36 if ((strdate.substring(strdate.length() - 5).indexOf("+") == 0 || strdate.substring(strdate.length() - 5).indexOf("-") == 0) && strdate.substring(strdate.length() - 5).indexOf(":") == 2) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 37 String sign = strdate.substring(strdate.length() - 5, strdate.length() - 4); 38 strdate = strdate.substring(0, strdate.length() - 5) + sign + "0" + strdate.substring(strdate.length() - 4); //$NON-NLS-1$ 39 } 40 41 String dateEnd = strdate.substring(strdate.length() - 6); 42 43 /* 44 * try to deal with -05:00 or +02:00 at end of date replace with -0500 or 45 * +0200 46 */ 47 if ((dateEnd.indexOf("-") == 0 || dateEnd.indexOf("+") == 0) && dateEnd.indexOf(":") == 3) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ 48 if (!"GMT".equals(strdate.substring(strdate.length() - 9, strdate.length() - 6))) { //$NON-NLS-1$ 49 String oldDate = strdate; 50 String newEnd = dateEnd.substring(0, 3) + dateEnd.substring(4); 51 strdate = oldDate.substring(0, oldDate.length() - 6) + newEnd; 52 } 53 } 54 } 55 56 /* Try to parse the date */ 57 int i = 0; 58 while (i < CUSTOM_DATE_FORMATS.length) { 59 try { 60 61 /* 62 * This Block needs to be synchronized, because the parse-Method in 63 * SimpleDateFormat is not Thread-Safe. 64 */ 65 synchronized (CUSTOM_DATE_FORMATS[i]) { 66 return CUSTOM_DATE_FORMATS[i].parse(strdate); 67 } 68 } catch (ParseException e) { 69 i++; 70 } catch (NumberFormatException e) { 71 i++; 72 } 73 } 74 return result; 75 } 76 77 /** Initialize the array of common date formats and formatter */ 78 static { 79 80 /* Create Date Formats */ 81 final String[] possibleDateFormats = { 82 /* RFC 1123 with 2-digit Year */"EEE, dd MMM yy HH:mm:ss z", 83 /* RFC 1123 with 4-digit Year */"EEE, dd MMM yyyy HH:mm:ss z", 84 /* RFC 1123 with no Timezone */"EEE, dd MMM yy HH:mm:ss", 85 /* Variant of RFC 1123 */"EEE, MMM dd yy HH:mm:ss", 86 /* RFC 1123 with no Seconds */"EEE, dd MMM yy HH:mm z", 87 /* Variant of RFC 1123 */"EEE dd MMM yyyy HH:mm:ss", 88 /* RFC 1123 with no Day */"dd MMM yy HH:mm:ss z", 89 /* RFC 1123 with no Day or Seconds */"dd MMM yy HH:mm z", 90 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ssZ", 91 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss'Z'", 92 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:sszzzz", 93 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss z", 94 /* ISO 8601 */"yyyy-MM-dd'T'HH:mm:ssz", 95 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss.SSSz", 96 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HHmmss.SSSz", 97 /* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss", 98 /* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mmZ", 99 /* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mm'Z'", 100 /* RFC 1123 without Day Name */"dd MMM yyyy HH:mm:ss z", 101 /* RFC 1123 without Day Name and Seconds */"dd MMM yyyy HH:mm z", 102 /* Simple Date Format */"yyyy-MM-dd", 103 /* Simple Date Format */"MMM dd, yyyy"}; 104 105 /* Create the dateformats */ 106 CUSTOM_DATE_FORMATS = new SimpleDateFormat[possibleDateFormats.length]; 107 108 for (int i = 0; i < possibleDateFormats.length; i++) { 109 CUSTOM_DATE_FORMATS[i] = new SimpleDateFormat(possibleDateFormats[i], Locale.getDefault()); 110 CUSTOM_DATE_FORMATS[i].setTimeZone(TIMEZONE); 111 } 112 } 113 114 public static final String yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm"; 115 public static final String yyyy_MM_dd_HH_mm_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; 116 public static final String HH_mm = "HH:mm"; 117 118 public static final Map<String, SimpleDateFormat> dateFormatMap = new HashMap<>(); 119 120 public static String format_yyyy_MM_dd_HH_mm(long timeInMillis) { 121 return getDateFormat(yyyy_MM_dd_HH_mm).format(timeInMillis); 122 } 123 124 public static String format_HH_mm(long timeInMillis){ 125 return getDateFormat(HH_mm).format(timeInMillis); 126 } 127 128 public static SimpleDateFormat getDateFormat(String pattern) { 129 SimpleDateFormat dateFormat = dateFormatMap.get(pattern); 130 if (dateFormat == null) { 131 dateFormat = new SimpleDateFormat(pattern); 132 dateFormatMap.put(pattern, dateFormat); 133 } 134 return dateFormat; 135 } 136 137 public static String format_yyyy_MM_dd_HH_mm(Date date) { 138 return getDateFormat(yyyy_MM_dd_HH_mm).format(date); 139 } 140 141 public static String format_yyyy_MM_dd_HH_mm_SSS(Date date) { 142 return getDateFormat(yyyy_MM_dd_HH_mm_SSS).format(date); 143 } 144 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步