7

Suppose I have a simple String, extracted from an array of strings (representing dates) -

var myDateString = "2015-11-25 04:31:32.0"

Now, I want to convert it to a string that looks like Nov 25, 2015.

For that, I assume I need to -

  • get a NSDate date object from string using NSDateFormatter
  • get a string from that NSDate object by using some functionality (which I've been unable to find)

I've been trying this in Playground, but have been unable to solve such a simple problem.

Here is what I have tried -

Line 1| var dateFormatter = NSDateFormatter()
Line 2| dateFormatter.locale = NSLocale.currentLocale()
Line 3| dateFormatter.dateFormat = "YYYY-MM-dd HH:mm:ss.A"
Line 4| let somedate = dateFormatter.dateFromString(str)
Line 5| let somedateString = dateFormatter.stringFromDate(somedate!)

In the sidebar of Xcode, line 4 prints "Nov 25, 2015, 12:00 AM", but when I try to print a string from somedate, I get "2015-11-25 00:00:00.0".

I haven't found a single proper explanation of NSDates anywhere.

This was so much easier in Java with parse() and format() functions for Dates.

2
  • "I haven't found a single proper explanation of NSDates anywhere." – There is a Data Formatting Guide with a link to the Unicode date format specification. The first error is that the format for years is "yyyy", not "YYYY". Also you need two different formatters for the conversion, one for dateFromString and the other for stringFromDate. Commented Jan 16, 2016 at 11:32
  • ... and YYYY instead of yyyy is cause for a good laugh every year around the 1st of January when everybody posts how their dates are broken. Commented Jan 16, 2016 at 13:02

2 Answers 2

24

Updated for Swift 3.0

You need two date formatters - one to make sense of your input string and convert to a NSDate, and a different formatter to create the output string

    let myDateString = "2016-01-01 04:31:32.0"

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.A"
    let myDate = dateFormatter.date(from: myDateString)!

    dateFormatter.dateFormat = "MMM dd, YYYY"
    let somedateString = dateFormatter.string(from: myDate)

I have updated this answer to change the date formatter from YYYY to yyyy. In most cases, there will be no difference between the two, but YYYY may treat the first few days of the year as being part of the last complete week of the previous year.

The Apple developer guides explain it like this.

A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.

Sign up to request clarification or add additional context in comments.

3 Comments

@KunalChawla: NSDateFormatter is from the Foundation library which predates Swift by many years.
NO NO NO NO NO. Read up on the difference between YYYY and yyyy and fix your own code where you use YYYY.
@KunalChawla: Swift is awesome. The date formatter with YYYY is broken.
4

You will need two date formatters as others suggested. Additionally, one of your issues is that you are using .A instead of .S for the fractional seconds. (See the link to Unicode Date Format Specification as pointed out in @MartinR's comment)

.A is Milliseconds in day

.S is Fractional Second

The the following in a Playground:

let dateString = "2015-11-25 04:01:32.0"

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.S"                 // Note: S is fractional second
let dateFromString = dateFormatter.dateFromString(dateString)      // "Nov 25, 2015, 4:31 AM" as NSDate

let dateFormatter2 = NSDateFormatter()
dateFormatter2.dateFormat = "MMM d, yyyy"

let stringFromDate = dateFormatter2.stringFromDate(dateFromString!) // "Nov 25, 2015" as String

1 Comment

OP wants to transform "2015-11-25 04:31:32.0" to "Nov 25, 2015". I wonder how you do that with a single date format. – Your code produces the original date string.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.