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         }
复制代码

 

代码:

复制代码
  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 }
View Code
复制代码

 

posted @   晕菜一员  阅读(28547)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示