Date Formatter unexpected output - swift

let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "MMMM dd, yyyy 'at' HH:mm:ss aa z"
dateFormatter.amSymbol = "AM"
let dateString = "February 02, 2022 at 10:49:06 AM GMT+3"
print(dateFormatter.date(from: dateString)!)
Prints -> 2022-02-01 21:49:06 +0000
why this prints 21:49 instead of 10:49?

So, yes, we're both missing something. The time format should be use hh not HH (HH is for 24 hour time and some weird conversation was going in there)
So, I tested in a Playground with...
let threeHoursFromGMT = Measurement(value: 3, unit: UnitDuration.hours).converted(to: UnitDuration.seconds).value
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "MMMM dd, yyyy 'at' hh:mm:ss aa z"
dateFormatter.amSymbol = "AM"
dateFormatter.timeZone = TimeZone.init(secondsFromGMT: Int(threeHoursFromGMT))
let dateString = "February 02, 2022 at 10:49:06 AM GMT+3"
let date = dateFormatter.date(from: dateString)!
dateFormatter.string(from: dateFormatter.date(from: dateString)!)
And it generated
"Feb 2, 2022 at 6:49 PM" // let date = dateFormatter.date(from: dateString)!
"February 02, 2022 at 10:49:06 AM GMT+3" // dateFormatter.string(from: dateFormatter.date(from: dateString)!)
The first output is based on my timezone (+11) and the second is based on the formatter requirements (using +3)

Related

How to format date as month and year in Swift? [duplicate]

How will I convert this datetime from the date?
From this: 2016-02-29 12:24:26
to: Feb 29, 2016
So far, this is my code and it returns a nil value:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date: NSDate? = dateFormatter.dateFromString("2016-02-29 12:24:26")
print(date)
This may be useful for who want to use dateformatter.dateformat;
if you want 12.09.18 you use dateformatter.dateformat = "dd.MM.yy"
Wednesday, Sep 12, 2018 --> EEEE, MMM d, yyyy
09/12/2018 --> MM/dd/yyyy
09-12-2018 14:11 --> MM-dd-yyyy HH:mm
Sep 12, 2:11 PM --> MMM d, h:mm a
September 2018 --> MMMM yyyy
Sep 12, 2018 --> MMM d, yyyy
Wed, 12 Sep 2018 14:11:54 +0000 --> E, d MMM yyyy HH:mm:ss Z
2018-09-12T14:11:54+0000 --> yyyy-MM-dd'T'HH:mm:ssZ
12.09.18 --> dd.MM.yy
10:41:02.112 --> HH:mm:ss.SSS
Here are alternatives:
Era: G (AD), GGGG (Anno Domini)
Year: y (2018), yy (18), yyyy (2018)
Month: M, MM, MMM, MMMM, MMMMM
Day of month: d, dd
Day name of week: E, EEEE, EEEEE, EEEEEE
You have to declare 2 different NSDateFormatters, the first to convert the string to a NSDate and the second to print the date in your format.
Try this code:
let dateFormatterGet = NSDateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateFormatterPrint = NSDateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"
let date: NSDate? = dateFormatterGet.dateFromString("2016-02-29 12:24:26")
print(dateFormatterPrint.stringFromDate(date!))
Swift 3 and higher:
From Swift 3 NSDate class has been changed to Date and NSDateFormatter to DateFormatter.
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"
if let date = dateFormatterGet.date(from: "2016-02-29 12:24:26") {
print(dateFormatterPrint.string(from: date))
} else {
print("There was an error decoding the string")
}
Swift - 5.0
let date = Date()
let format = date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss") // Set output format
extension Date {
func getFormattedDate(format: String) -> String {
let dateformat = DateFormatter()
dateformat.dateFormat = format
return dateformat.string(from: self)
}
}
Swift - 4.0
2018-02-01T19:10:04+00:00 Convert Feb 01,2018
extension Date {
static func getFormattedDate(string: String , formatter:String) -> String{
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"
let date: Date? = dateFormatterGet.date(from: "2018-02-01T19:10:04+00:00")
print("Date",dateFormatterPrint.string(from: date!)) // Feb 01,2018
return dateFormatterPrint.string(from: date!);
}
}
Swift 3 and higher
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
dateFormatter.locale = Locale.current
print(dateFormatter.string(from: date)) // Jan 2, 2001
This is also helpful when you want to localize your App. The Locale(identifier: ) uses the ISO 639-1 Code.
See also the Apple Documentation
Swift 3 version with the new Date object instead NSDate:
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy"
let date: Date? = dateFormatterGet.date(from: "2017-02-14 17:24:26")
print(dateFormatter.string(from: date!))
EDIT: after mitul-nakum suggestion
Convert #BatyrCan answer to Swift 5.3 with extra formats. Tested in Xcode 12.
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
var dateFromStr = dateFormatter.date(from: "12:16:45")!
dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
//Output: 12:16:45 PM on January 01, 2000
dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
//Output: Sat, 1 Jan 2000 12:16:45 +0600
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//Output: 2000-01-01T12:16:45+0600
dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
//Output: Saturday, Jan 1, 2000
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
//Output: 01-01-2000 12:16
dateFormatter.dateFormat = "MMM d, h:mm a"
//Output: Jan 1, 12:16 PM
dateFormatter.dateFormat = "HH:mm:ss.SSS"
//Output: 12:16:45.000
dateFormatter.dateFormat = "MMM d, yyyy"
//Output: Jan 1, 2000
dateFormatter.dateFormat = "MM/dd/yyyy"
//Output: 01/01/2000
dateFormatter.dateFormat = "hh:mm:ss a"
//Output: 12:16:45 PM
dateFormatter.dateFormat = "MMMM yyyy"
//Output: January 2000
dateFormatter.dateFormat = "dd.MM.yy"
//Output: 01.01.00
//Customisable AP/PM symbols
dateFormatter.amSymbol = "am"
dateFormatter.pmSymbol = "Pm"
dateFormatter.dateFormat = "a"
//Output: Pm
// Usage
var timeFromDate = dateFormatter.string(from: dateFromStr)
print(timeFromDate)
swift 3
let date : Date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
let todaysDate = dateFormatter.string(from: date)
I solved my problem to the format yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(e.g 2018-06-15T00:00:00.000Z) with this:
func formatDate(date: String) -> String {
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
// dateFormatter.locale = Locale(identifier: "en_US") //uncomment if you don't want to get the system default format.
let dateObj: Date? = dateFormatterGet.date(from: date)
return dateFormatter.string(from: dateObj!)
}
iOS 15.0+
iPadOS 15.0+,
macOS 12.0+,
Mac Catalyst 15.0+,
tvOS 15.0+,
watchOS 8.0+,
Xcode 13.0+
Use formatted(date:time:)
let now = Date.now
let date = now.formatted(date: .abbreviated, time: .omitted)
Instead of .abbreviated, you may use another DateStyle such as .long, .numeric or define a custom format.
SwiftUI
Text(myDate, format: Date.FormatStyle(date: .numeric, time: .omitted))
or simply use:
Text(myDate, style: .date)
Reference
formatted(date:time:)
init(_:format:)
Text.DateStyle
Swift 4, 4.2 and 5
func getFormattedDate(date: Date, format: String) -> String {
let dateformat = DateFormatter()
dateformat.dateFormat = format
return dateformat.string(from: date)
}
let formatingDate = getFormattedDate(date: Date(), format: "dd-MMM-yyyy")
print(formatingDate)
Swift Version: 5.6 + Above
DateFormatter’s dateFormatter property is used to format Date with a custom String Pattern.
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
let date = dateFormatter.string(from: datePicker.date)
print(date)
//Feb 28, 2022
If you want anything that shouldn’t be formatted and printed, then use single quotes around that word. Like; ‘at’
dateFormatter.dateFormat = "MMM dd, yyyy 'at' hh:MM a"
// May 29, 2022 at 12:05 PM
These are all possible Patterns to Format Date, Time & Time Zone.
Swift 3 with a Date extension
extension Date {
func string(with format: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
return dateFormatter.string(from: self)
}
}
Then you can use it like so:
let date = Date()
date.string(with: "MMM dd, yyyy")
If you want to parse date from "1996-12-19T16:39:57-08:00", use the following format "yyyy-MM-dd'T'HH:mm:ssZZZZZ":
let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
/* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from: string)
from Apple https://developer.apple.com/documentation/foundation/dateformatter
Another interessant possibility of format date. This screenshot belongs to Apple's App "News".
Here is the code:
let dateFormat1 = DateFormatter()
dateFormat1.dateFormat = "EEEE"
let stringDay = dateFormat1.string(from: Date())
let dateFormat2 = DateFormatter()
dateFormat2.dateFormat = "MMMM"
let stringMonth = dateFormat2.string(from: Date())
let dateFormat3 = DateFormatter()
dateFormat3.dateFormat = "dd"
let numDay = dateFormat3.string(from: Date())
let stringDate = String(format: "%#\n%# %#", stringDay.uppercased(), stringMonth.uppercased(), numDay)
Nothing to add to alternative proposed by lorenzoliveto. It's just perfect.
let dateFormat = DateFormatter()
dateFormat.dateFormat = "EEEE\nMMMM dd"
let stringDate = dateFormat.string(from: Date()).uppercased()
import UIKit
// Example iso date time
let isoDateArray = [
"2020-03-18T07:32:39.88Z",
"2020-03-18T07:32:39Z",
"2020-03-18T07:32:39.8Z",
"2020-03-18T07:32:39.88Z",
"2020-03-18T07:32:39.8834Z"
]
let dateFormatterGetWithMs = DateFormatter()
let dateFormatterGetNoMs = DateFormatter()
// Formater with and without millisecond
dateFormatterGetWithMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
dateFormatterGetNoMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"
for dateString in isoDateArray {
var date: Date? = dateFormatterGetWithMs.date(from: dateString)
if (date == nil){
date = dateFormatterGetNoMs.date(from: dateString)
}
print("===========>",date!)
}
just use below function to convert date format:-
let convertedFormat = convertToString(dateString: "2019-02-12 11:23:12", formatIn: "yyyy-MM-dd hh:mm:ss", formatOut: "MMM dd, yyyy") //calling function
print(convertedFormat) // feb 12 2019
func convertToString (dateString: String, formatIn : String, formatOut : String) -> String {
let dateFormater = DateFormatter()
dateFormater.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
dateFormater.dateFormat = formatIn
let date = dateFormater.date(from: dateString)
dateFormater.timeZone = NSTimeZone.system
dateFormater.dateFormat = formatOut
let timeStr = dateFormater.string(from: date!)
return timeStr
}
To convert 2016-02-29 12:24:26 into a date, use this date formatter:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
Edit: To get the output Feb 29, 2016 use this date formatter:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
For Swift 4.2, 5
Pass date and format as whatever way you want.
To choose format you can visit, NSDATEFORMATTER website:
static func dateFormatter(date: Date,dateFormat:String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateFormat
return dateFormatter.string(from: date)
}
Place it in extension and call it like below. It's easy to use throughout the application.
self.getFormattedDate(strDate: "20-March-2019", currentFomat: "dd-MMM-yyyy", expectedFromat: "yyyy-MM-dd")
Implementation
func getFormattedDate(strDate: String , currentFomat:String, expectedFromat: String) -> String{
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = currentFomat
let date : Date = dateFormatterGet.date(from: strDate) ?? Date()
dateFormatterGet.dateFormat = expectedFromat
return dateFormatterGet.string(from: date)
}
From iOS 15 use something like this:
extension Date {
var string: String {
if #available(iOS 15.0, *) {
return self.formatted(date: .complete, time: .complete)
} else {
return self.description
}
}
}
Here is a full date format extension for swift
extension Date {
func getFormattedDate(format: String) -> String {
let dateformat = DateFormatter()
dateformat.dateFormat = format
return dateformat.string(from: self)
}
func getFormattedDate(style: DateFormatter.Style) -> String {
let dateformat = DateFormatter()
dateformat.dateStyle = style
return dateformat.string(from: self)
}
}
Usage
myDate.getFormattedDate(style: .medium) //medium, short, full, long
OR
myDate.getFormattedDate(format: "yyyy/MM/dd HH:mm:ss")
swift 3
func dataFormat(dataJ: Double) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
let date = Date(timeIntervalSince1970: dataJ)
return (dataJ != nil) ? "Today, \(dateFormatter.string(from: date))" : "Date Invalid"
}
I recommend to add timezone by default. I will show an example for swift 5
1. new an extension file Date+Formatter.swift
import Foundation
extension Date {
func getFormattedDateString(format: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
dateFormatter.timeZone = TimeZone.current
return dateFormatter.string(from: self)
}
}
Usage example
let date = Date()
let dateString = date.getFormattedDateString(format: "yyyy-MM-dd HH:mm:ss")
print("dateString > \(dateString)")
// print
// dateString > 2020-04-30 15:15:21
class Utils {
class func dateFormatter(_ date: Date, _ format: String) -> String {
let dateformat = DateFormatter()
dateformat.dateFormat = format
return dateformat.string(from: date)
}
}
print(Utils.dateFormatter(Date(), "EEEE, MMM d, yyyy"))
Create class name Utils import same function and you can use globally accesss any where with your date and formate

Swift String value converted into strange Date value [duplicate]

This question already has answers here:
What is happening to the year?
(1 answer)
Difference between 'YYYY' and 'yyyy' in NSDateFormatter
(4 answers)
Closed 1 year ago.
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, Y (E)"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter.string(from: self)
}
}
extension String {
func toDate() -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, Y (E)"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter.date(from: self)!
}
}
That is my code.
I want to convert my string value into a right date value. The results i’m getting are totally different form what i want.
Here is an example:
String : September 09, 2021 (Thu)
Converted Date : 2020-12-24 00:00:00 +0000
I want it to be like this:
Converted Date : September 09, 2021 (Thu) (or 2021-09-09 00:00:00 +0000)
Can you change
dateFormatter.dateFormat = "MMMM dd, Y (E)"
To:
dateFormatter.dateFormat = "MMMM dd, yyyy (E)"
You pass the full year in String: September 09, 2021 (Thu) so you need to get yyyy to the right way.
extension String {
func toDate() -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy (E)"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter.date(from: self)!
}
}
here you can do what you want:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy (E)" // here is your foramt
dateFormatter.timeZone = TimeZone(identifier: "UTC")
guard let date = dateFormatter.date(from: "September 09, 2021 (Thu)") else {
fatalError()
}
print(date) // output: 2021-09-09 00:00:00 +0000
Note that, the time zone which you choosed, should matched to your device time zone.
Replace Your Function with Following Code
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy (E)"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter.string(from: self)
}
}
extension String {
func toDate() -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy (E)"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
return dateFormatter.date(from: self)!
}
}
There was slight variance of in your dateFormat in your toDate() Function
Replaced MMM from MMMM
Replaced yyyy from Y
I don't know why it was showing different date but now it should work😅

Convert From String To date with 12 hours time formatting

Since yesterday I'm trying to solve this issue but I give up. Now I have string date "2018-10-30 01:00 PM" and when I'm trying to convert it to date the time format will change to 24 hours. I mean it will be like "2018-10-30 13:00:00 UTC".
Here is my code:
let dateFormatter5 = DateFormatter()
dateFormatter5.dateFormat = "yyyy-MM-dd hh:mm a"
dateFormatter5.locale = Locale(identifier: "en_US_POSIX")
dateFormatter5.timeZone = NSTimeZone(abbreviation: "GMT+0:00")! as TimeZone
let now = dateFormatter5.date(from: "2018-10-30 01:00 pm")!
I need to convert this string with the same time format (12 hours).
Any idea?
If your original date string is UTC timezone:
let dateStr = "2018-10-30 01:00 PM"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
if let now = dateFormatter.date(from: dateStr) {
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'UTC'"
dateFormatter.string(from: now) // "2018-10-30 13:00:00 UTC"
}

Show AM/PM in capitals in swift

I wrote the following code to show a datetime in a particular format:
let formatter = NSDateFormatter()
formatter.dateStyle = NSDateFormatterStyle.LongStyle
formatter.timeStyle = .MediumStyle
formatter.dateFormat = "HH:mm a 'on' MMMM dd, yyyy"
let dateString = formatter.stringFromDate(newDate!)
println(dateString)
Output
12:16 pm on July 17, 2015
I want to show 'pm' as 'PM'(in capitals) and if phone has 24 hours format then AM/PM should not appear. Please help me.
You can set your DateFormatter amSymbol and pmSymbol as follow:
Xcode 8.3 • Swift 3.1
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "h:mm a 'on' MMMM dd, yyyy"
formatter.amSymbol = "AM"
formatter.pmSymbol = "PM"
let dateString = formatter.string(from: Date())
print(dateString) // "4:44 PM on June 23, 2016\n"
Added some formats in one place. Hope someone get help.
Xcode 12 - Swift 5.3
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
var dateFromStr = dateFormatter.date(from: "12:16:45")!
dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
//Output: 12:16:45 PM on January 01, 2000
dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
//Output: Sat, 1 Jan 2000 12:16:45 +0600
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//Output: 2000-01-01T12:16:45+0600
dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
//Output: Saturday, Jan 1, 2000
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
//Output: 01-01-2000 12:16
dateFormatter.dateFormat = "MMM d, h:mm a"
//Output: Jan 1, 12:16 PM
dateFormatter.dateFormat = "HH:mm:ss.SSS"
//Output: 12:16:45.000
dateFormatter.dateFormat = "MMM d, yyyy"
//Output: Jan 1, 2000
dateFormatter.dateFormat = "MM/dd/yyyy"
//Output: 01/01/2000
dateFormatter.dateFormat = "hh:mm:ss a"
//Output: 12:16:45 PM
dateFormatter.dateFormat = "MMMM yyyy"
//Output: January 2000
dateFormatter.dateFormat = "dd.MM.yy"
//Output: 01.01.00
//Output: Customisable AP/PM symbols
dateFormatter.amSymbol = "am"
dateFormatter.pmSymbol = "Pm"
dateFormatter.dateFormat = "a"
//Output: Pm
// Usage
var timeFromDate = dateFormatter.string(from: dateFromStr)
print(timeFromDate)

Get NSDate and convert it from the 24 hour format to 12 hour format in swift

I've seen this post for other languages but not for swift. I have a date saved in the format of 2015-08-31 21:36:00 +0000 and I'm able to extract the day, month, year and weekday with the code below to produce Monday, August 31, 2015. When I try to use:
let hourInt = components.hour
var hourString = String(hourInt)
It prints a four hour difference. In this case "17" for the "21". How do I
display it as 9:36 P.M.?
let flags: NSCalendarUnit = NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitWeekday | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear
let date = NSDate()
let dateFormatter: NSDateFormatter = NSDateFormatter()
let components = NSCalendar.currentCalendar().components(flags, fromDate: array.date)
let weekday = components.weekday
let weekdays = dateFormatter.weekdaySymbols
let weekdayString = weekdays[weekday-1] as! String
let month = components.month
let months = dateFormatter.monthSymbols
let monthString = months[month-1] as! String
let dayInt = components.day
var dayString = String(dayInt)
let year = components.year
let yearString = String(year)
println(weekdayString + ", " + monthString + " " + dayString + ", " + yearString)
Your date string suffix +0000 means it is UTC time if you want to display time at UTC you need to specify it when setting your date formatter.
let dateString = "2015-08-31 21:36:00 +0000"
let df = NSDateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
if let date = df.dateFromString(dateString) {
// now you have your date object
// to display UTC time you have to specify timeZOne UTC
df.timeZone = NSTimeZone(forSecondsFromGMT: 0)
df.dateFormat = "EEEE, MMMM dd, yyyy h:mm:ss a"
let stringFromDate = df.stringFromDate(date)
println(stringFromDate) // "Monday, August 31, 2015 9:36:00 PM"
}
If you want to strip the time zone information, pass the GMT time zone.
This code does quite the same as yours
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy"
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
println(dateFormatter.stringFromDate(array.date))
Setting locale of NSDateFormatter to en_US_POSIX fixed issue for me.
let sharedFormatter:NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier:"en_US_POSIX")
return formatter
}()
sharedFormatter.dateFormat = "MMM d YYYY, h:mm a"
let dateString = sharedFormatter.stringFromDate(NSDate())
// Aug 2 2016, 5:45 PM
Swift 5.0
let dateString = "2015-08-31 21:36:00 +0000"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
if let date = dateFormatter.date(from: dateString) {
// now you have your date object
// to display UTC time you have to specify timeZOne UTC
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy h:mm:ss a"
let stringFromDate = dateFormatter.string(from: date)
print(stringFromDate) // "Monday, August 31, 2015 9:36:00 PM"
}