格式化字符串中的日期

时间:2010-05-30 15:10:57

标签: iphone nsstring nsdate nsdateformatter

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

例如:2012-05-29 23:55:52加入29/05 *newline* 2010

我认为我没有获得NSDate和NSDateFormatter背后的逻辑,我想......

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

5 个答案:

答案 0 :(得分:9)

您需要创建一个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;

瞧!你有新的约会对象:)

答案 1 :(得分:1)

如果您只进行简单的字符串处理,则不需要经历日期对象。

 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)

答案 2 :(得分:0)

请查找以下代码,将日期从一种格式转换为另一种格式。它将为您当前的区域留出时间。

var userScores = 
(from e in db.Entries join se in db.UserEntries
on e.Id equals se.EntryId                                           
into ese from se in 
ese.DefaultIfEmpty()
where se.UserId == "898128"
select new 
{
EntryLabel=e.Label,
EntryValue=se.ValueAmount,
}).ToList();

ViewData["userScores "] = userScores;

答案 3 :(得分:0)

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

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")

答案 4 :(得分:0)

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

     }


}