2017-06-22 290 views
0

我看着槽堆溢出找到答案,我找不到它我想投这个字符串值“1900-01-01T00 :00:00“到日期格式,我试图用一些像这样的格式:投下“1900-01-01T00:00:00”字符串值至今

"yyyy-MM-dd HH:mm:ss" 
"EEE, dd MMM yyyy hh:mm:ss +zzzz" 
"YYYY-MM-dd HH:mm:ss.A" 
"yyyy-MM-dd HH:mm:ss.S" 

但其中任何人的工作。 ,我想这样的

"dd-mm-yyyy" 

的日期格式希望你能帮帮我!

谢谢。

+0

首先,您需要将字符串转换到一个'Date'所以你需要一个匹配的日期格式。没有列出的人甚至接近匹配诸如“1900-01-01T00:00:00”之类的字符串。 – rmaddy

+0

“我正在尝试一些类似的格式”:你可能有更好的机会在抽奖。一个提示?把日期字符串写在你的格式上,尽量匹配它。例如“”EEE,...“永远不会匹配它,并阅读每个字母或其中的几个意思是什么意思http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html# Date_Format_Patterns另一个提示:将你的字符串分成多个部分,并试图找到每个部分的格式。 – Larme

回答

-1

使用我创建的扩展名,您可以在其中传递格式作为参数。

extension String 
{ 
    func toDate(dateFormat format : String) -> Date 
    { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = format 
     if let date = dateFormatter.date(from: self) 
     { 
      return date 
     } 
     print("Invalid arguments ! Returning Current Date . ") 
     return Date() 
    } 
} 
"1900-01-01T00:00:00".toDate(dateFormat: "yyyy-MM-dd'T'HH:mm:ss") //Plyground call test 
+2

你必须引用格式中的'T'。 – rmaddy

+0

你是对的,将编辑答案。 –

+1

这将创建一个DateFormatter对象单次将字符串转换为Date –

-1

这是我做的自定义日期格式化:

extension DateFormatter { 

    static let inDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
     return dateFormatter 
    }() 

    static let outDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "dd-mm-yyyy" 
     return dateFormatter 
    }() 
} 

,然后用它喜欢:

if let date = DateFormatter.inDateFormatter.date(from: "1900-01-01T00:00:00") { 
    let newDateString = DateFormatter.outDateFormatter.string(from: date); 
    print(newDateString) //prints 01-00-1900 
} 

这避免任何潜在的性能问题,显然在使用点,虽然仍然简洁。

+1

“dd-mm-yyyy”错误MM'是月份'mm'是分钟 –

+0

这是由OP指定的格式。显然这很容易定制。 – PeejWeej

+1

你为什么要使用日/分/年? –

1

这是一个两步过程,第一转换1900-01-01T00:00:00(被称为RFC 3999或ISO 8601的日期,称为定义该格式的规格)为Date对象,然后转换该Date对象回字符串在的01-01-1900形式:

  1. 将字符串转换在1900-01-01T00:00:00形式为Date对象,你可以使用ISO8601DateFormatter

    let formatter = ISO8601DateFormatter() 
    formatter.formatOptions.remove(.withTimeZone) 
    
    let date = formatter.date(from: string)! 
    

    这相当于以下DateFormat,其中一个必须手动设置localeen_US_POSIX(因为RFC 3999/ISO 8601日期使用公历,无论使用什么设备的默认日历类型),并将timeZone到GMT /祖鲁语,因为通常RFC 3999/ISO 8601个日期表示GMT,除非另有规定:

    let formatter = DateFormatter() 
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
    formatter.locale = Locale(identifier: "en_US_POSIX") 
    formatter.timeZone = TimeZone(secondsFromGMT: 0) 
    
    let date = formatter.date(from: string)! 
    

    有关的时区和语言环境的重要性更多信息,解析RFC 3999和ISO 8601的日期,看到苹果的Technical Q&A 1480

  2. 然后,该Date对象转换为一个字符串转换为01-01-1900(日,月,年),你会使用的dd-MM-yyyy格式字符串(请注意大写MM为“月”,将其从mm区分对于 “分”):

    let formatter2 = DateFormatter() 
    formatter2.dateFormat = "dd-MM-yyyy" 
    
    let string = formatter2.string(from: date) 
    

    两个关于dateFormat字符串意见:

    • 如果这个字符串显示到t他可以使用用户dateStyle而不是dateFormat,例如,:

      formatter2.dateStyle = .short 
      

      虽然这会产生稍微不同的格式,例如dd/MM/yy,这种方法的优点是字符串将被本地化(例如,英国用户将看到MM/dd/yyyy,他们看到短日期的首选方式)。

      它只是取决于您的dd-MM-yyyy格式的目的。如果是出于内部目的,请继续使用dateFormat。但如果是在UI中显示日期,请改用dateStyle,并享受DateFormatter为您自动执行的本地化。有关更多信息,请参阅DateFormatter reference中的“使用用户可见的日期和时间表示”部分。

    • 请注意,在没有为此第二个格式化程序指定的timeZone时,它会假定ISO 8601日期为GMT,而您希望在当地时区中查看日期。例如,(1900-01-01T00:00:00 GMT是1899年12月31日下午4点在加利福尼亚州)。如果您想查看原始ISO 8601对象的日期字符串(未针对时区进行更正),则只需将此第二个格式化程序的timeZone设置为GMT即可。

      formatter2.timeZone = TimeZone(secondsFromGMT: 0) 
      

正如其他人所指出的那样,要避免不必要的重新实例化DateFormatter对象。所以,你可能会放在这些属性格式化被实例化一次,或者使用extension

extension DateFormatter { 
    static let customInputFormatter: ISO8601DateFormatter = { 
     let formatter = ISO8601DateFormatter() 
     formatter.formatOptions.remove(.withTimeZone) 
     return formatter 
    }() 

    static let customOutputFormatter: DateFormatter = { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "dd-MM-yyyy" 
     formatter.timeZone = TimeZone(secondsFromGMT: 0) // if you want date in your local timezone, remove this line 
     return formatter 
    }() 
} 

然后:

let input = "1900-01-01T00:00:00" 
let date = DateFormatter.customInputFormatter.date(from: input)! 
let output = DateFormatter.customOutputFormatter.string(from: date) 
print(output) 
相关问题