【问题标题】:Format a date from a string从字符串格式化日期
【发布时间】:2011-02-25 17:14:18
【问题描述】:

我正在尝试将日期从字符串格式化为另一种格式。

例如:2012-05-29 23:55:52 变为 29/05 *newline* 2010

我只是不明白 NSDate 和 NSDateFormatter 背后的逻辑,我想..

任何帮助将不胜感激。谢谢:)

【问题讨论】:

标签: iphone nsstring nsdate nsdateformatter


【解决方案1】:

您需要创建一个 NSDateFormatter,然后设置它的 dateFormat 以匹配您拥有的第一个日期,例如:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

这将设置您的日期格式化程序以识别您的日期字符串。然后,您可以从中获取一个 NSDate 对象使用

NSDate *myDate = [dateFormatter dateFromString:myDateString]; // myDateString is the 2012-05-29 23:55:52 string

这会给你一个代表那个日期的完整的 NSDate 对象。现在您需要重新格式化日期并将其转回字符串,因此将格式化程序上的 dateFormat 设置为新格式​​,并获得返回日期的新字符串表示:

[dateFormatter setDateFormat:@"dd/MM\nyyyy"];
NSString *newlyFormattedDateString = [dateFormatter stringFromDate:myDate];
[dateFormatter release], dateFormatter = nil;

瞧!你有新的约会了:)

【讨论】:

  • 谢谢!我不知道您可以通过这种方式从日期中获取字符串!这成功了。
【解决方案2】:

如果你只是做简单的字符串处理,其实不需要遍历一个日期对象。

 let dateString = "2012-05-29 23:55:52"
 let dateParts = dateString.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "- :")) 
 let newDateString = "\(dateParts[2])/\(dateParts[1])\n\(dateParts[0])"

 print(newDateString)

【讨论】:

  • 我以前从来没有这样想过——这实际上是一个很好的解决方案,而且它可能比日期对象使用更少的资源。谢谢!
【解决方案3】:

请找到以下代码将日期从一种格式转换为另一种格式。它会给你当前区域的时间。

func convertDateFormat(sourceString : String, sourceFormat : String, destinationFormat : String) -> String{

    let dateFormatter = DateFormatter();
    dateFormatter.dateFormat = sourceFormat;

    if let date = dateFormatter.date(from: sourceString){
        dateFormatter.dateFormat = destinationFormat;
        return dateFormatter.string(from: date)
    }else{
        return ""
    }
}

【讨论】:

    【解决方案4】:

    对于那些喜欢使用扩展的人。

    extension String {
    func formattedDate(inputFormat: String, outputFormat: String) -> String {
        let inputFormatter = DateFormatter()
        inputFormatter.dateFormat = inputFormat
    
        if let date = inputFormatter.date(from: self) {
            let outputFormatter = DateFormatter()
            outputFormatter.dateFormat = outputFormat
            return outputFormatter.string(from: date)
        } else {
            return self  // If the string is not in the correct format, we return it without formatting
        }
    }
    

    用途:

    tfDate.text = strDate.formattedDate(inputFormat: "yyyy-MM-dd", outputFormat: "dd/MM/yyyy")
    

    【讨论】:

      【解决方案5】:

      JFrank 的回答很好。但苹果说:

      “提高效率的缓存格式化程序”(https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html) 避免分配和丢弃。 所以,因为静态已经很懒了......

      (为清楚起见,我只显示生成日期..输出格式类似..)

      import Foundation
      
      
      extension Date{
      
      
          // Global constants and variables are always computed lazily:
          static private var yyyyMMdd_dateFormatter : DateFormatter  {
              let df = DateFormatter()
              df.dateFormat = "yyyyMMdd"
              return df
          }
      
      
          init?(YYYYMMDDString: String?){
      
              guard let dateString = YYYYMMDDString else {return nil}
      
              guard let date = Self.yyyyMMdd_dateFormatter.date(from: dateString) else {
                  return nil
              }
                  self = date
      
           }
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多