Skip to content

Instantly share code, notes, and snippets.

@fpg1503
Created January 9, 2017 06:22
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fpg1503/f583ccfd8ac863b71c621843f5ca31b1 to your computer and use it in GitHub Desktop.
Save fpg1503/f583ccfd8ac863b71c621843f5ca31b1 to your computer and use it in GitHub Desktop.
Swifty Date Formats
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
}
}
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
}
//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
//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