【问题标题】:String to NSdate returns nilNSdate 的字符串返回 nil
【发布时间】:2015-07-09 14:54:05
【问题描述】:

我想将我的 String dateTime 分隔为不同的变量 date 和 time,因为我将单独显示它。我怎么能这样做?

这是我仅获取日期的代码,它返回 nil:

let datetime = "2015-04-06T13:24:11.913"
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MMM-DD-YYYY"
    let date = dateFormatter.dateFromString(datetime)
    println(date)

提前致谢。

更新: 这是我的错误,

更新 2: 它不会返回错误,但它给了我格式化日期的错误月份

【问题讨论】:

  • 您的日期格式与日期字符串的格式不同。他们需要匹配。
  • 我将使用什么格式?以及如何将时间和日期划分为不同的变量?谢谢
  • 你的日期字符串是当地时间还是 UTC ?
  • @LeonardoSavioDabus ,我不知道。我怎么知道呢?
  • 它可能是 UTC,如果你不指定它将被视为本地时间

标签: ios swift datetime nsdateformatter


【解决方案1】:

除了您正在测试的字符串有毫秒而数组中的日期只有秒的问题之外,现在的问题是 Y 是一年中的一周。您需要在日期格式中使用小写“y”以及小写“d”。日期格式应如下所示:

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

要从日期中提取月份部分,您可以使用此扩展:

extension Date {
    var month: Int {
        Calendar(identifier: .gregorian).component(.month, from: self)
    }
}


NSDate().month   // 5

【讨论】:

【解决方案2】:
        let datetime = "2015-04-06T13:24:11" //"2015-04-06T13:24:11.913"
        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-mm-dd'T'HH:mm:ss" //"yyyy-mm-dd'T'HH:mm:ss.SSS"
        let date = dateFormatter.dateFromString(datetime)
        let myTime = NSDateFormatter.localizedStringFromDate(date!, dateStyle: .NoStyle , timeStyle: .MediumStyle)
        let myDate = NSDateFormatter.localizedStringFromDate(date!, dateStyle: .ShortStyle , timeStyle: .NoStyle)

        println(date!)//DateWithTime
        println(myDate)//Date
        println(myTime)//time 

这可以帮助您格式化.. NSDateFormatter_Class 感谢@LeonardoSavioDabus 提供这张图片 => Swift NSDate UTC time and local time

【讨论】:

  • @LeonardoSavioDabus 感谢这张图片,它对我有很大帮助.. :)
  • @Apple 检查你的日期格式和日期字符串2015-04-06T13:24:11,你告诉我们2015-04-06T13:24:11.913。我现在更新我的答案检查这个
  • @Apple 检查你的datetime?并从dateFormatter.dateFormat 中删除.SSS 它可以工作。检查并告诉我。
  • @Yuyutsu 是的,我的错。不过谢谢,你的回答很方便。
  • 我非常专注于消除错误,我没有注意到它给了我错误的月份。
【解决方案3】:

一旦用户将 iOS 日历设置为公历以外的任何日期,其他答案中的所有 NSDateFormatters 都会给出错误的日期。您的日期字符串也没有提及任何时区,所以我假设是 UTC。

let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(name: "UTC")
formatter.calendar = NSCalendar.gregorianCalendar()
formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS"

【讨论】:

  • 实际上他们提供的代码有效,但显然,它只有在日期被硬编码时才有效。就我而言,我从数组中获取字符串日期时间,我不知道这似乎是什么问题
【解决方案4】:

使用此格式化程序

let datetime = "2015-04-06T13:24:11.913"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
let date = dateFormatter.dateFromString(datetime)
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitHour, fromDate: date!)
components.day//This is 6

您的格式化程序必须与您的字符串匹配

这是我的游乐场截图,效果很好。

【讨论】:

  • 好的,但是我怎样才能获得日期和时间的单独变量?
  • 查看更新,您可以使用NSCalendar 获取NSDate 的每个部分
  • 日期变量仍然为零。它仍然返回错误
  • 看我的截图,效果很好。请发布你的错误
  • 您需要从日期格式中删除“.SSS”。 "yyyy-MM-dd'T'HH:mm:ss"
【解决方案5】:

这样试试,

    let datetime = "2015-04-06T13:24:11.913"
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
    let dateFromString = dateFormatter.dateFromString(datetime)
    var calendar = NSCalendar.currentCalendar()
    var components:NSDateComponents = calendar.components(NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitSecond | NSCalendarUnit.CalendarUnitHour, fromDate: dateFromString!)
    var stringDate = "\(components.month)-\(components.day)-\(components.year)"
    var stringTime = "\(components.hour):\(components.minute):\(components.second)"
    println(stringDate)
    println(stringTime)

你会得到像这样的输出:

2015 年 4 月 6 日

13:24:11

享受编码!

【讨论】:

  • 它运行完美,你可以在评论中发布错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多