Created
January 9, 2017 06:22
-
-
Save fpg1503/f583ccfd8ac863b71c621843f5ca31b1 to your computer and use it in GitHub Desktop.
Swifty Date Formats
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct DateFormat: DateFormatConvertible { | |
let dateFormat: String | |
init() { | |
dateFormat = "" | |
} | |
init(format: DateFormatConvertible) { | |
dateFormat = format.dateFormat | |
} | |
init(formats: [DateFormatConvertible]) { | |
dateFormat = formats.reduce("", +).dateFormat | |
} | |
func year(_ style: YearStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func quarter(_ style: QuarterStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func month(_ style: MonthStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func day(_ style: DayStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func hour(_ style: HourStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func minute(_ style: MinuteStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func second(_ style: SecondStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func timezone(_ style: TimeZoneStyle) -> DateFormat { | |
return DateFormat(formats: [dateFormat, style]) | |
} | |
func separator(_ separator: Separator) -> DateFormat { | |
return DateFormat(formats: [dateFormat, separator]) | |
} | |
func string(_ string: String) -> DateFormat { | |
return DateFormat(formats: [dateFormat, "'", string, "'"]) | |
} | |
} | |
extension DateFormatter { | |
func setDateFormat(_ format: DateFormatConvertible) { | |
dateFormat = format.dateFormat | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protocol DateFormatConvertible { | |
var dateFormat: String { get } | |
} | |
extension String: DateFormatConvertible { | |
var dateFormat: String { return self } | |
} | |
func + (lhs: DateFormatConvertible, rhs: DateFormatConvertible) -> DateFormatConvertible { | |
return lhs.dateFormat + rhs.dateFormat | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//yyyy-MM-dd'T'HH:mm:ssZ | |
let format = DateFormat() | |
.year(.fourDigits) | |
.separator(.dash) | |
.month(.zeroPaddedNumber) | |
.separator(.dash) | |
.day(.zeroPaddedNumber) | |
.string("T") | |
.hour(.zeroPaddedTwentyFourHour) | |
.separator(.colon) | |
.minute(.zeroPaddedNumber) | |
.separator(.colon) | |
.second(.zeroPaddedNumber) | |
.timezone(.RFC822) | |
let formatter = DateFormatter() | |
formatter.setDateFormat(format) | |
print(format.dateFormat) //yyyy-MM-dd'T'HH:mm:ssZ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//TODO Adopt TR-35 (http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns) | |
//MARK :- Styles | |
enum YearStyle: String, DateFormatConvertible { | |
case noPadding = "y" | |
case twoDigits = "yy" | |
case fourDigits = "yyyy" | |
var dateFormat: String { return rawValue } | |
} | |
enum QuarterStyle: String, DateFormatConvertible { | |
case number = "Q" | |
case zeroPaddedNumber = "QQ" | |
case qAndNumber = "QQQ" | |
case spelledOut = "QQQQ" | |
var dateFormat: String { return rawValue } | |
} | |
enum MonthStyle: String, DateFormatConvertible { | |
case number = "M" | |
case zeroPaddedNumber = "MM" | |
case shortName = "MMM" | |
case fullName = "MMMM" | |
case narrowName = "MMMMM" | |
var dateFormat: String { return rawValue } | |
} | |
enum DayStyle: String, DateFormatConvertible { | |
case number = "d" | |
case zeroPaddedNumber = "dd" | |
case dayOfWeekInMonth = "F" | |
case shortDayOfWeek = "E" | |
case fullDayOfWeek = "EEEE" | |
case narrowDayOfWeek = "EEEEE" | |
var dateFormat: String { return rawValue } | |
} | |
enum HourStyle: String, DateFormatConvertible { | |
case twelveHour = "h" | |
case zeroPaddedTwelveHour = "hh" | |
case twentyFourHour = "H" | |
case zeroPaddedTwentyFourHour = "HH" | |
case AMorPM = "a" | |
var dateFormat: String { return rawValue } | |
} | |
enum MinuteStyle: String, DateFormatConvertible { | |
case number = "m" | |
case zeroPaddedNumber = "mm" | |
var dateFormat: String { return rawValue } | |
} | |
enum SecondStyle: String, DateFormatConvertible { | |
case number = "s" | |
case zeroPaddedNumber = "ss" | |
var dateFormat: String { return rawValue } | |
} | |
enum TimeZoneStyle: String, DateFormatConvertible { | |
case threeLetterName = "zzz" | |
case expandedName = "zzzz" | |
case RFC822 = "Z" | |
case ISO8601 = "ZZZZZ" | |
var dateFormat: String { return rawValue } | |
} | |
enum Separator: String, DateFormatConvertible { | |
case dash = "-" | |
case slash = "/" | |
case colon = ":" | |
case space = " " | |
var dateFormat: String { return rawValue } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment