001 package ezvcard.util; 002 003 import java.text.DateFormat; 004 import java.text.SimpleDateFormat; 005 import java.util.regex.Pattern; 006 007 /** 008 * Copyright 2011 George El-Haddad. All rights reserved. 009 * 010 * Redistribution and use in source and binary forms, with or without modification, are 011 * permitted provided that the following conditions are met: 012 * 013 * 1. Redistributions of source code must retain the above copyright notice, this list of 014 * conditions and the following disclaimer. 015 * 016 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 017 * of conditions and the following disclaimer in the documentation and/or other materials 018 * provided with the distribution. 019 * 020 * THIS SOFTWARE IS PROVIDED BY GEORGE EL-HADDAD ''AS IS'' AND ANY EXPRESS OR IMPLIED 021 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 022 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GEORGE EL-HADDAD OR 023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 025 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 027 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 028 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 * 030 * The views and conclusions contained in the software and documentation are those of the 031 * authors and should not be interpreted as representing official policies, either expressed 032 * or implied, of George El-Haddad. 033 */ 034 035 /* 036 Copyright (c) 2013, Michael Angstadt 037 All rights reserved. 038 039 Redistribution and use in source and binary forms, with or without 040 modification, are permitted provided that the following conditions are met: 041 042 1. Redistributions of source code must retain the above copyright notice, this 043 list of conditions and the following disclaimer. 044 2. Redistributions in binary form must reproduce the above copyright notice, 045 this list of conditions and the following disclaimer in the documentation 046 and/or other materials provided with the distribution. 047 048 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 049 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 050 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 051 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 052 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 053 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 054 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 055 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 056 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 057 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 058 059 The views and conclusions contained in the software and documentation are those 060 of the authors and should not be interpreted as representing official policies, 061 either expressed or implied, of the FreeBSD Project. 062 */ 063 064 /** 065 * Represents the various ISO8601 date/time formats that vCard dates can be 066 * represented as. 067 * @author George El-Haddad 068 * @author Michael Angstadt 069 */ 070 public enum ISOFormat { 071 //@formatter:off 072 /** 073 * Example: 20120701 074 */ 075 DATE_BASIC("\\d{8}","yyyyMMdd"), 076 077 /** 078 * Example: 2012-07-01 079 */ 080 DATE_EXTENDED("\\d{4}-\\d{2}-\\d{2}", "yyyy-MM-dd"), 081 082 /** 083 * Example: 20120701T142110-0500 084 */ 085 TIME_BASIC("\\d{8}T\\d{6}[-\\+]\\d{4}", "yyyyMMdd'T'HHmmssZ"), 086 087 /** 088 * Example: 2012-07-01T14:21:10-05:00 089 */ 090 TIME_EXTENDED("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[-\\+]\\d{2}:\\d{2}", "yyyy-MM-dd'T'HH:mm:ssZ"), 091 092 /** 093 * Example: 20120701T192110Z 094 */ 095 UTC_TIME_BASIC("\\d{8}T\\d{6}Z", "yyyyMMdd'T'HHmmssZ", "yyyyMMdd'T'HHmmss'Z'"), 096 097 /** 098 * Example: 2012-07-01T19:21:10Z 099 */ 100 UTC_TIME_EXTENDED("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z", "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd'T'HH:mm:ss'Z'"), 101 102 /** 103 * Example: 2012-07-01T14:21:10-0500 104 */ 105 HCARD_TIME_TAG("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[-\\+]\\d{2}:?\\d{2}", "yyyy-MM-dd'T'HH:mm:ssZ"); 106 //@formatter:on 107 108 /** 109 * The regular expression pattern for the date format. 110 */ 111 private final Pattern pattern; 112 113 /** 114 * The {@link SimpleDateFormat} format string used for parsing dates. 115 */ 116 private final String parseFormat; 117 118 /** 119 * The {@link SimpleDateFormat} format string used for formatting dates. 120 */ 121 private final String formatFormat; 122 123 /** 124 * @param regex the regular expression for the date format 125 * @param format the {@link SimpleDateFormat} format string used for parsing 126 * and formatting dates. 127 */ 128 private ISOFormat(String regex, String format) { 129 this(regex, format, format); 130 } 131 132 /** 133 * @param regex the regular expression for the date format 134 * @param parseFormat the {@link SimpleDateFormat} format string used for 135 * parsing dates. 136 * @param formatFormat the {@link SimpleDateFormat} format string used for 137 * formatting dates. 138 */ 139 private ISOFormat(String regex, String parseFormat, String formatFormat) { 140 pattern = Pattern.compile(regex); 141 this.parseFormat = parseFormat; 142 this.formatFormat = formatFormat; 143 } 144 145 /** 146 * Determines whether a date string is in this ISO format. 147 * @param dateStr the date string 148 * @return true if it matches the date format, false if not 149 */ 150 public boolean matches(String dateStr) { 151 return pattern.matcher(dateStr).matches(); 152 } 153 154 /** 155 * Builds a {@link DateFormat} object for parsing dates in this ISO format. 156 * @return the {@link DateFormat} object 157 */ 158 public DateFormat getParseDateFormat() { 159 return new SimpleDateFormat(parseFormat); 160 } 161 162 /** 163 * Builds a {@link DateFormat} object for formatting dates in this ISO 164 * format. 165 * @return the {@link DateFormat} object 166 */ 167 public DateFormat getFormatDateFormat() { 168 return new SimpleDateFormat(formatFormat); 169 } 170 }