| /* | |
| * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| * | |
| * Portions copyright 2006-2009 James Murty. Please see LICENSE.txt | |
| * for applicable license terms and NOTICE.txt for applicable notices. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"). | |
| * You may not use this file except in compliance with the License. | |
| * A copy of the License is located at | |
| * | |
| * http://aws.amazon.com/apache2.0 | |
| * | |
| * or in the "license" file accompanying this file. This file is distributed | |
| * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either | |
| * express or implied. See the License for the specific language governing | |
| * permissions and limitations under the License. | |
| */ | |
| package com.amazonaws.util; | |
| import com.amazonaws.annotation.ThreadSafe; | |
| import java.time.LocalDateTime; | |
| import java.time.format.DateTimeFormatter; | |
| import java.time.ZoneId; | |
| import java.util.Date; | |
| /** | |
| * Utilities for parsing and formatting dates. | |
| */ | |
| @ThreadSafe | |
| public class DateUtils { | |
| private static final ZoneId GMT = ZoneId.of("GMT"); | |
| /** ISO 8601 format */ | |
| protected static final DateTimeFormatter iso8601DateFormat = | |
| DateTimeFormatter.ISO_DATE_TIME.withZone(GMT); | |
| /** Alternate ISO 8601 format without fractional seconds */ | |
| protected static final DateTimeFormatter alternateIso8601DateFormat = | |
| DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(GMT); | |
| /** | |
| * Parses the specified date string as an ISO 8601 date and returns the Date | |
| * object. | |
| * | |
| * @param dateString | |
| * The date string to parse. | |
| * | |
| * @return The parsed Date object. | |
| */ | |
| public static Date parseISO8601Date(String dateString) { | |
| return doParseISO8601Date(dateString); | |
| } | |
| static Date doParseISO8601Date(final String dateStringOrig) { | |
| String dateString = dateStringOrig; | |
| // For EC2 Spot Fleet. | |
| if (dateString.endsWith("+0000")) { | |
| dateString = dateString | |
| .substring(0, dateString.length() - 5) | |
| .concat("Z"); | |
| } | |
| try { | |
| // Normal case: nothing special here | |
| final LocalDateTime ldt = LocalDateTime.parse(dateString, iso8601DateFormat); | |
| return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); | |
| } catch (IllegalArgumentException e) { | |
| try { | |
| final LocalDateTime ldt = LocalDateTime.parse(dateString, alternateIso8601DateFormat); | |
| return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); | |
| // If the first ISO 8601 parser didn't work, try the alternate | |
| // version which doesn't include fractional seconds | |
| } catch(Exception oops) { | |
| // no the alternative route doesn't work; let's bubble up the original exception | |
| throw e; | |
| } | |
| } | |
| } | |
| } |