Skip to content

Instantly share code, notes, and snippets.

@fbongcam
Last active May 22, 2021 14:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fbongcam/ec64d6f1074253fc82e7cfa43f92f4f4 to your computer and use it in GitHub Desktop.
Save fbongcam/ec64d6f1074253fc82e7cfa43f92f4f4 to your computer and use it in GitHub Desktop.
Collection of date formats in Swift
/*
Collection of date formats
@author Filip Bongcam
Useful for determining format of date when unknown,
when converting string to date
Usage:
To determine unknown format of date (as String)
' dateFormat_collection.determineDateFormat(date: "String") '
To just access the collection
' dateFormat_collection.dateFormats '
' dateFormat_collection.timeZones '
*/
class dateFormat_collection {
/*
TimeZone abbrevations
*/
static let timeZones_abbrevations = [
/*
Wikipedia
Source: https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations
*/
"ACDT" : "+1030", // UTC +10:30
"ACST" : "+0930", // UTC +09:30
"ACT" : "−0500", // UTC−05
"ACT" : ("+0630", "+0900"), // UTC+06:30 – UTC+09
"ACWST" : "+0845", // UTC +08:45
"ADT" : "−0300", // UTC−03
"AEDT" : "+1100", // UTC+11
"AEST" : "+1000", // UTC+10
"AET" : ("+1000", "+1100"), // UTC+10 - UTC+11
"AFT" : "+0430", // UTC +04:30
"AKDT" : "−0800", // UTC−08
"AKST" : "−0900", // UTC−09
"ALMT" : "+0600", // UTC+06
"AMST" : "−0300", // UTC−03
"AMT" : "−0400", // UTC−04
"AMT" : "+0400", // UTC+04
"ANAT" : "+1200", // UTC+12
"AQTT" : "+0500", // UTC+05
"ART" : "−0300", // UTC−03
"AST" : "+0300", // UTC+03
"AST" : "−0400", // UTC−04
"AWST" : "+0800", // UTC+08
"AZOST" : "+0000", // UTC+00
"AZOT" : "−0100", // UTC−01
"AZT" : "+0400", // UTC+04
"BNT" : "+0800", // UTC+08
"BIOT" : "+0600", // UTC+06
"BIT" : "−1200", // UTC−12
"BOT" : "−0400", // UTC−04
"BRST" : "−0200", // UTC−02
"BRT" : "−0300", // UTC−03
"BST" : "+0600", // UTC+06
"BST" : "+1100", // UTC+11
"BST" : "+0100", // UTC+01
"BTT" : "+0600", // UTC+06
"CAT" : "+0200", // UTC+02
"CCT" : "+0630", // UTC +06:30
"CDT" : "−0500", // UTC−05
"CDT" : "−0400", // UTC−04
"CEST" : "+0200", // UTC+02
"CET" : "+0100", // UTC+01
"CHADT" : "+1345", // UTC +13:45
"CHAST" : "+1245", // UTC +12:45
"CHOT" : "+0800", // UTC+08
"CHOST" : "+0900", // UTC+09
"CHST" : "+1000", // UTC+10
"CHUT" : "+1000", // UTC+10
"CIST" : "−0800", // UTC−08
"CKT" : "−1000", // UTC−10
"CLST" : "−0300", // UTC−03
"CLT" : "−0400", // UTC−04
"COST" : "−0400", // UTC−04
"COT" : "−0500", // UTC−05
"CST" : "−0600", // UTC−06
"CST" : "+0800", // UTC+08
"CST" : "−0500", // UTC−05
"CT" : ("−0600", "−0500"), // UTC−06 - UTC−05
"CVT" : "−0100", // UTC−01
"CWST" : "+0845", // UTC +08:45
"CXT" : "+0700", // UTC+07
"DAVT" : "+0700", // UTC+07
"DDUT" : "+1000", // UTC+10
"DFT" : "+0100", // UTC+01
"EASST" : "−0500", // UTC−05
"EAST" : "−0600", // UTC−06
"EAT" : "+0300", // UTC+03
"ECT" : "−0400", // UTC−04
"ECT" : "−0500", // UTC−05
"EDT" : "−0400", // UTC−04
"EEST" : "+0300", // UTC+03
"EET" : "+0200", // UTC+02
"EGST" : "+0000", // UTC+00
"EGT" : "−0100", // UTC−01
"EST" : "−0500", // UTC−05
"FET" : "+0300", // UTC+03
"FJT" : "+1200", // UTC+12
"FKST" : "−0300", // UTC−03
"FKT" : "−0400", // UTC−04
"FNT" : "−0200", // UTC−02
"GALT" : "−0600", // UTC−06
"GAMT" : "−0900", // UTC−09
"GET" : "+0400", // UTC+04
"GFT" : "−0300", // UTC−03
"GILT" : "+1200", // UTC+12
"GIT" : "−0900", // UTC−09
"GMT" : "+0000", // UTC+00
"GST" : "−0200", // UTC−02
"GST" : "+0400", // UTC+04
"GYT" : "−0400", // UTC−04
"HDT" : "−0900", // UTC−09
"HAEC" : "+0200", // UTC+02
"HST" : "−1000", // UTC−10
"HKT" : "+0800", // UTC+08
"HMT" : "+0500", // UTC+05
"HOVST" : "+0800", // UTC+08
"HOVT" : "+0700", // UTC+07
"ICT" : "+0700", // UTC+07
"IDLW" : "−1200", // UTC−12
"IDT" : "+0300", // UTC+03
"IOT" : "+0300", // UTC+03
"IRDT" : "+0430", // UTC +04:30
"IRKT" : "+0800", // UTC+08
"IRST" : "+0330", // UTC +03:30
"IST" : "+0530", // UTC +05:30
"IST" : "+0100", // UTC+01
"IST" : "+0200", // UTC+02
"JST" : "+0900", // UTC+09
"KALT" : "+0200", // UTC+02
"KGT" : "+0600", // UTC+06
"KOST" : "+1100", // UTC+11
"KRAT" : "+0700", // UTC+07
"KST" : "+0900", // UTC+09
"LHST" : "+1030", // UTC +10:30
"LHST" : "+1100", // UTC+11
"LINT" : "+1400", // UTC+14
"MAGT" : "+1200", // UTC+12
"MART" : "−0930", // UTC −09:30
"MAWT" : "+0500", // UTC+05
"MDT" : "−0600", // UTC−06
"MET" : "+0100", // UTC+01
"MEST" : "+0200", // UTC+02
"MHT" : "+1200", // UTC+12
"MIST" : "+1100", // UTC+11
"MIT" : "−0930", // UTC −09:30
"MMT" : "+0630", // UTC +06:30
"MSK" : "+0300", // UTC+03
"MST" : "+0800", // UTC+08
"MST" : "−0700", // UTC−07
"MUT" : "+0400", // UTC+04
"MVT" : "+0500", // UTC+05
"MYT" : "+0800", // UTC+08
"NCT" : "+1100", // UTC+11
"NDT" : "−0230", // UTC −02:30
"NFT" : "+1100", // UTC+11
"NOVT" : "+0700", // UTC+07
"NPT" : "+0545", // UTC +05:45
"NST" : "−0330", // UTC −03:30
"NT" : "−0330", // UTC −03:30
"NUT" : "−1100", // UTC−11
"NZDT" : "+1300", // UTC+13
"NZST" : "+1200", // UTC+12
"OMST" : "+0600", // UTC+06
"ORAT" : "+0500", // UTC+05
"PDT" : "−0700", // UTC−07
"PET" : "−0500", // UTC−05
"PETT" : "+1200", // UTC+12
"PGT" : "+1000", // UTC+10
"PHOT" : "+1300", // UTC+13
"PHT" : "+0800", // UTC+08
"PKT" : "+0500", // UTC+05
"PMDT" : "−0200", // UTC−02
"PMST" : "−0300", // UTC−03
"PONT" : "+1100", // UTC+11
"PST" : "−0800", // UTC−08
"PST" : "+0800", // UTC+08
"PWT" : "+0900", // UTC+09
"PYST" : "−0300", // UTC−03
"PYT" : "−0400", // UTC−04
"RET" : "+0400", // UTC+04
"ROTT" : "−0300", // UTC−03
"SAKT" : "+1100", // UTC+11
"SAMT" : "+0400", // UTC+04
"SAST" : "+0200", // UTC+02
"SBT" : "+1100", // UTC+11
"SCT" : "+0400", // UTC+04
"SDT" : "−1000", // UTC−10
"SGT" : "+0800", // UTC+08
"SLST" : "+0530", // UTC +05:30
"SRET" : "+1100", // UTC+11
"SRT" : "−0300", // UTC−03
"SST" : "−1100", // UTC−11
"SST" : "+0800", // UTC+08
"SYOT" : "+0300", // UTC+03
"TAHT" : "−1000", // UTC−10
"THA" : "+0700", // UTC+07
"TFT" : "+0500", // UTC+05
"TJT" : "+0500", // UTC+05
"TKT" : "+1300", // UTC+13
"TLT" : "+0900", // UTC+09
"TMT" : "+0500", // UTC+05
"TRT" : "+0300", // UTC+03
"TOT" : "+1300", // UTC+13
"TVT" : "+1200", // UTC+12
"ULAST" : "+0900", // UTC+09
"ULAT" : "+0800", // UTC+08
"UTC" : "+0000", // UTC+00
"UYST" : "−0200", // UTC−02
"UYT" : "−0300", // UTC−03
"UZT" : "+0500", // UTC+05
"VET" : "−0400", // UTC−04
"VLAT" : "+1000", // UTC+10
"VOLT" : "+0400", // UTC+04
"VOST" : "+0600", // UTC+06
"VUT" : "+1100", // UTC+11
"WAKT" : "+1200", // UTC+12
"WAST" : "+0200", // UTC+02
"WAT" : "+0100", // UTC+01
"WEST" : "+0100", // UTC+01
"WET" : "+0000", // UTC+00
"WIB" : "+0700", // UTC+07
"WIT" : "+0900", // UTC+09
"WITA" : "+0800", // UTC+08
"WGST" : "−0200", // UTC−02
"WGT" : "−0300", // UTC−03
"WST" : "+0800", // UTC+08
"YAKT" : "+0900", // UTC+09
"YEKT" : "+0500", // UTC+05
] as [String : Any]
static let dateFormats = [
/*
IBM Chart
Source: https://www.ibm.com/docs/en/spss-statistics/24.0.0?topic=formats-date-time
*/
// ------------------------------
"dd-mmm-yy", // 28-OCT-90
"dd-mmm-yyyy", // 28-OCT-1990
"mm/dd/yy", // 10/28/90
"mm/dd/yyyy", // 10/28/1990
"dd.mm.yy", // 28.10.90
"dd.mm.yyyy", // 28.10.1990
"yyddd", // 90301
"yyyyddd", // 1990301
"yy/mm/dd", // 90/10/28
"yyyy/mm/dd", // 1990/10/28
"q Q yy", // 4 Q 90
"q Q yyyy", // 4 Q 1990
"mmm yy", // OCT 90
"mmm yyyy", // OCT 1990
"ww WK yy", // 43 WK 90
"ww WK yyyy", // 43 WK 1990
"hh:mm", // 01:02
"hh:mm:ss.s", // 01:02:34.75
"mm:ss", // 02:34
"mm:ss.s", // 02:34.75
"dd hh:mm", // 20 08:03
"dd hh:mm:ss.s", // 20 08:03:00
"dd-mmm-yyyy hh:mm", // 20-JUN-1990 08:03
"dd-mmm-yyyy hh:mm:ss.s", // 20-JUN-1990 08:03:00
"yyyy-mm-dd hh:mm", // 1990-06-20 08:03
"yyyy-mm-dd hh:mm:ss.s", // 1990-06-20 08:03:00.0
// ------------------------------
/*
Stackoverflow forums (@BatyrCan)
Source: https://stackoverflow.com/questions/35700281/date-format-in-swift#answer-52297497
*/
// ------------------------------
"EEEE, MMM d, yyyy", // Wednesday, Sep 12, 2018
"MM/dd/yyyy", // 09/12/2018
"MM-dd-yyyy HH:mm", // 09-12-2018 14:11
"MMM d, h:mm a", // Sep 12, 2:11 PM
"MMMM yyyy", // September 2018
"MMM d, yyyy", // Sep 1, 2018
"MMM dd, yyyy", // Sep 01, 2018
"E, d MMM yyyy HH:mm:ss Z", // Wed, 1 Sep 2018 14:11:54 +0000
"E, d MMM't' yyyy HH:mm:ss Z", // Wed, 1 Sept 2018 14:11:54 +0000
"E, dd MMM yyyy HH:mm:ss Z", // Wed, 01 Sep 2018 14:11:54 +0000
"yyyy-MM-dd'T'HH:mm:ssZ", // 2018-09-12T14:11:54+0000
"dd.MM.yy", // 12.09.18
"HH:mm:ss.SSS", // 10:41:02.112
// ------------------------------
"yyyy-MM-dd", // 1970-01-01
"EEE, dd MMMM yyyy HH:mm:ss 'PDT'", // Fri, 15 June 2011 17:00:00 PDT
"EEE, dd MMMM yyyy HH:mm:ss 'GMT'", // Fri, 15 June 2011 17:00:00 GMT
"EEE, dd MMMM yyyy HH:mm:ss 'UTC'", // Fri, 15 June 2011 17:00:00 UTC
"EEE, dd MMMM yyyy HH:mm:ss 'PDT'ZZZ", // Fri, 15 June 2011 17:00:00 PDT+0000
"EEE, dd MMMM yyyy HH:mm:ss 'GMT'ZZZ", // Fri, 15 June 2011 17:00:00 GMT+0000
"EEE, dd MMMM yyyy HH:mm:ss 'UTC'ZZZ", // Fri, 15 June 2011 17:00:00 UTC+0000
]
static func determineDateFormat(date: String) -> String?
{
// DateFormat object
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale.current
dateFormatter.timeZone = TimeZone.current
for i in 0..<dateFormats.count
{
dateFormatter.dateFormat = dateFormats[i]
if dateFormatter.date(from: date) != nil
{
return dateFormats[i]
}
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment