Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-iOS-不同格式的日期和时间_Ios_Swift_Timestamp_Nsdateformatter - Fatal编程技术网

Swift-iOS-不同格式的日期和时间

Swift-iOS-不同格式的日期和时间,ios,swift,timestamp,nsdateformatter,Ios,Swift,Timestamp,Nsdateformatter,我正在为一个用swift编写的应用程序工作,我想操纵日期和时间 let timestamp = NSDateFormatter.localizedStringFromDate( NSDate(), dateStyle: .ShortStyle, timeStyle: .ShortStyle ) 返回 2/12/15, 11:27 PM 如果我希望日期和时间采用不同的格式,例如,日期采用欧洲格式,如dd/mm/yy,小时采用24小时格式,没有AM和PM。是否有一些函数我

我正在为一个用swift编写的应用程序工作,我想操纵日期和时间

let timestamp = NSDateFormatter.localizedStringFromDate(
    NSDate(),
    dateStyle: .ShortStyle,
    timeStyle: .ShortStyle
)
返回

2/12/15, 11:27 PM

如果我希望日期和时间采用不同的格式,例如,日期采用欧洲格式,如
dd/mm/yy
,小时采用24小时格式,没有AM和PM。是否有一些函数我可以使用,或者我必须使用N个字符串来对各种元素重新排序?

您已经找到了
NSDateFormatter
,请阅读其中的文档

用于格式字符定义
请参阅:

另外:.

如Zaph所述,您需要遵循文档。诚然,与其他类引用相比,它可能不是最直接的。简单的回答是,你用它来确定你想要什么格式。一旦你这样做了:

let dateFormatter = NSDateFormatter()
//the "M/d/yy, H:mm" is put together from the Symbol Table
dateFormatter.dateFormat = "M/d/yy, H:mm"
dateFormatter.stringFromDate(NSDate())
如果需要将字符串日期转换为NSDate,还需要能够使用该表

let dateAsString = "02/12/15, 16:48"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/d/yyyy, H:mm"
let date = dateFormatter.dateFromString(dateAsString)

如前所述,您必须使用DateFormatter来格式化日期对象。最简单的方法是创建只读的计算属性日期扩展名


只读计算属性

具有getter但没有setter的计算属性称为 只读计算属性。只读计算属性始终为空 返回一个值,可以通过点语法访问,但不能 设置为不同的值

注意:

必须声明计算属性,包括只读计算属性 属性作为带有var关键字的变量属性,因为 这个值不是固定的。let关键字仅用于常量 属性,以指示它们的值一旦更改就无法更改 设置为实例初始化的一部分

您可以通过以下方式简化只读计算属性的声明: 删除get关键字及其大括号:




要将其转换回,可以创建另一个只读计算属性,但作为字符串扩展名:

 extension String {
    var date: Date? {
        return Formatter.date.date(from: self)
    }
    func dateFormatted(with dateFormat: String = "dd/M/yyyy, H:mm", calendar: Calendar = Calendar(identifier: .iso8601), defaultDate: Date? = nil, locale: Locale = Locale(identifier: "en_US_POSIX"), timeZone: TimeZone = .current) -> Date? {
        Formatter.date.calendar = calendar
        Formatter.date.defaultDate = defaultDate ?? calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())
        Formatter.date.locale = locale
        Formatter.date.timeZone = timeZone
        Formatter.date.dateFormat = dateFormat
        return Formatter.date.date(from: self)
    }
}

用法:

let dateFormatted = Date().europeanFormattedEn_US         //"29/9/2018, 16:16"
if let date = dateFormatted.date {
    print(date.description(with:.current)) // Saturday, September 29, 2018 at 4:16:00 PM Brasilia Standard Time\n"\
    date.europeanFormattedEn_US                         // "29/9/2018, 16:27"
}

为Swift 4编辑

func convertDateFormatter(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    dateFormatter.locale = Locale(identifier: "your_loc_id")
    let convertedDate = dateFormatter.date(from: date)

    guard dateFormatter.date(from: date) != nil else {
        assert(false, "no date from string")
        return ""
    } 

    dateFormatter.dateFormat = "yyyy MMM HH:mm EEEE"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: convertedDate!)

    return timeStamp
}

我使用了与@iod07类似的方法,但作为扩展。 另外,我在评论中添加了一些解释,以了解它是如何工作的

基本上,只需将其添加到视图控制器的顶部或底部

extension NSString {

class func convertFormatOfDate(date: String, originalFormat: String, destinationFormat: String) -> String! {

    // Orginal format :
    let dateOriginalFormat = NSDateFormatter()
    dateOriginalFormat.dateFormat = originalFormat      // in the example it'll take "yy MM dd" (from our call)

    // Destination format :
    let dateDestinationFormat = NSDateFormatter()
    dateDestinationFormat.dateFormat = destinationFormat // in the example it'll take "EEEE dd MMMM yyyy" (from our call)

    // Convert current String Date to NSDate
    let dateFromString = dateOriginalFormat.dateFromString(date)

    // Convert new NSDate created above to String with the good format
    let dateFormated = dateDestinationFormat.stringFromDate(dateFromString!)

    return dateFormated

}
}
示例

假设您想将
“16 05 05”
转换为
“2016年5月5日星期四”
,您的日期声明如下
Let date=“16 06 05”

然后简单地用以下方法调用它:

let newDate = NSString.convertFormatOfDate(date, originalFormat: "yy MM dd", destinationFormat: "EEEE dd MMMM yyyy")

希望有帮助

格式化字符串的当前日期时间:

let currentDate = Date()
let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
let convertedDate: String = dateFormatter.string(from: currentDate) //08/10/2016 01:42:22 AM
Swift 3:

//This gives month as three letters (Jun, Dec, etc)
let justMonth = DateFormatter()
justMonth.dateFormat = "MMM"
myFirstLabel.text = justMonth.string(from: myDate)

//This gives the day of month, with no preceding 0s (6,14,29)
let justDay = DateFormatter()
justDay.dateFormat = "d"
mySecondLabel.text = justDay.string(from: myDate)

//This gives year as two digits, preceded by an apostrophe ('09, '16, etc)
let justYear = DateFormatter()
justYear.dateFormat = "yy"
myThirdLabel.text = "'\(justYear.string(from: lastCompDate))"
要了解更多格式,请将其签入包含所有可用格式的codingExplorer表。每个日期组件都有几个选项,例如:

年份:

  • “y”-2016年(第一年的早期日期为“1”)
  • “yy”-16(第一年:“01”
  • “yyy”-2016年(第一年:“001”)
  • “yyyy”-2016年(第一年:“0001”)
几乎每个组件都有2-4个选项,使用第一个字母来表示格式(day是“d”,hour是“h”,等等)。然而,month是大写字母“M”,因为小写字母“M”保留为分钟。不过还有一些例外情况,如果您想使用面向协议的编程(Swift 3),请查看链接!

1)创建可日期协议

protocol Dateable {
    func userFriendlyFullDate() -> String
    func userFriendlyHours() -> String
}
extension Date: Dateable {
    var  formatter: DateFormatter { return DateFormatter() }

    /** Return a user friendly hour */
    func userFriendlyFullDate() -> String {
        // Customize a date formatter
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }

    /** Return a user friendly hour */
    func userFriendlyHours() -> String {
        // Customize a date formatter
        formatter.dateFormat = "HH:mm"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }
 
    // You can add many cases you need like string to date formatter

}
2)扩展日期类并实现可日期协议

protocol Dateable {
    func userFriendlyFullDate() -> String
    func userFriendlyHours() -> String
}
extension Date: Dateable {
    var  formatter: DateFormatter { return DateFormatter() }

    /** Return a user friendly hour */
    func userFriendlyFullDate() -> String {
        // Customize a date formatter
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }

    /** Return a user friendly hour */
    func userFriendlyHours() -> String {
        // Customize a date formatter
        formatter.dateFormat = "HH:mm"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }
 
    // You can add many cases you need like string to date formatter

}
3)使用它

let currentDate: Date = Date()
let stringDate: String = currentDate.userFriendlyHours()
// Print 15:16
您可以通过以下方式使用它从设备获取当前格式:

let currentDateFormat = DateFormatter.dateFormat(fromTemplate: "MMddyyyy", options: 0, locale: Locale.current)

以下是一个适用于Xcode 10.1的解决方案(2019年2月23日):

如果您注意到我已经设置了
.dateFormat=“hh.mma”
,您将只获得时间。 结果:
01:30PM

extension String {

    func convertDatetring_TopreferredFormat(currentFormat: String, toFormat : String) ->  String {
        let dateFormator = DateFormatter()
        dateFormator.dateFormat = currentFormat
        let resultDate = dateFormator.date(from: self)
        dateFormator.dateFormat = toFormat
        return dateFormator.string(from: resultDate!)
    }

}
从视图控制器文件调用,如下所示

"your_date_string".convertDatetring_TopreferredFormat(currentFormat: "yyyy-MM-dd HH:mm:ss.s", toFormat: "dd-MMM-yyyy h:mm a")

这可能是一个旧的线程,但我最近正在处理datetimes,遇到了类似的问题,所以我最终创建了一个类似的实用程序

此实用程序将采用字符串日期并返回可选的日期对象

        func toDate(dateFormat: DateFormatType) -> Date? {
        let formatter = DateFormatter()
        formatter.timeZone = NSTimeZone(name: "UTC") as TimeZone?
        formatter.dateFormat = dateFormat.rawValue
        let temp = formatter.date(from: self)
        return formatter.date(from: self)
        }
DateFormatType
enum如下所示

        enum DateFormatType : String {
        case type1 = "yyyy-MM-dd - HH:mm:ss"
        case type2 = "dd/MM/yyyy"
        case type3 = "yyyy/MM/dd"
    }
我想在这里提到的一件重要事情是线路

formatter.timeZone=n时区(名称:“UTC”)作为时区?

添加这一行非常重要,因为如果没有这一行,
DateFormatter
将使用它的默认转换来转换日期,如果您与远程团队一起工作,并且根据日期的不同,您可能会看到不同的日期

希望这对iOS 8有所帮助+ 显式地指定
语言环境
既麻烦又困难。你永远不知道你的应用程序将在哪里使用。因此,我认为最好将
locale
设置为
Calender.current.locale
并使用
DateFormatter
setLocalizedDataFormatFromTemplate
方法

SetLocalizedDataFormatFromTemplate(:) 使用接收方指定的区域设置从模板设置日期格式。-

swift中的时间选择器
在一个地方添加了一些格式。希望有人能得到帮助

Xcode 12-Swift 5.3

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
var dateFromStr = dateFormatter.date(from: "12:16:45")!

dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
//Output: 12:16:45 PM on January 01, 2000

dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
//Output: Sat, 1 Jan 2000 12:16:45 +0600

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//Output: 2000-01-01T12:16:45+0600

dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
//Output: Saturday, Jan 1, 2000

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
//Output: 01-01-2000 12:16

dateFormatter.dateFormat = "MMM d, h:mm a"
//Output: Jan 1, 12:16 PM

dateFormatter.dateFormat = "HH:mm:ss.SSS"
//Output: 12:16:45.000

dateFormatter.dateFormat = "MMM d, yyyy"
//Output: Jan 1, 2000

dateFormatter.dateFormat = "MM/dd/yyyy"
//Output: 01/01/2000

dateFormatter.dateFormat = "hh:mm:ss a"
//Output: 12:16:45 PM

dateFormatter.dateFormat = "MMMM yyyy"
//Output: January 2000

dateFormatter.dateFormat = "dd.MM.yy"
//Output: 01.01.00

//Output: Customisable AP/PM symbols
dateFormatter.amSymbol = "am"
dateFormatter.pmSymbol = "Pm"
dateFormatter.dateFormat = "a"
//Output: Pm

// Usage
var timeFromDate = dateFormatter.string(from: dateFromStr)
print(timeFromDate)
新日期(年、月、日,0,0,0,0)
是本地时间(作为输入)
新日期(年、月、日)
是UTC

我曾使用一个函数来实现iOS web上兼容的
YYYY-MM-DD
格式,但在比较中使用时也是UTC(不受getFullYear或类似链接限制),我发现最好只使用上述函数和strong(小时、分钟、秒、毫秒)构建日历,使用日期对象和本地引用进行计算

export const zeroPad = (num) => {
  var res = "0";
  if (String(num).length === 1) {
    res = `0${num}`;
  } else {
    res = num;
  }
  return res;
};

这只是这里最常被问到的5个问题之一。为什么可能重复一个扩展,一个简单的方法有问题?每个日期格式有不同的扩展?扩展是用户所期望的吗?分机是否通过is-a测试?asDate是一个字符串?找点别的事情做我不会删除我的答案beca
"your_date_string".convertDatetring_TopreferredFormat(currentFormat: "yyyy-MM-dd HH:mm:ss.s", toFormat: "dd-MMM-yyyy h:mm a")
        func toDate(dateFormat: DateFormatType) -> Date? {
        let formatter = DateFormatter()
        formatter.timeZone = NSTimeZone(name: "UTC") as TimeZone?
        formatter.dateFormat = dateFormat.rawValue
        let temp = formatter.date(from: self)
        return formatter.date(from: self)
        }
        enum DateFormatType : String {
        case type1 = "yyyy-MM-dd - HH:mm:ss"
        case type2 = "dd/MM/yyyy"
        case type3 = "yyyy/MM/dd"
    }
extension Date {
    func convertToLocaleDate(template: String) -> String {
        let dateFormatter = DateFormatter()

        let calender = Calendar.current

        dateFormatter.timeZone = calender.timeZone
        dateFormatter.locale = calender.locale
        dateFormatter.setLocalizedDateFormatFromTemplate(template)

        return dateFormatter.string(from: self)
    }
}



Date().convertToLocaleDate(template: "dd MMMM YYYY")
class ViewController: UIViewController {
    
    //timePicker
    @IBOutlet weak var lblTime: UILabel!
    @IBOutlet weak var timePicker: UIDatePicker!
    @IBOutlet weak var cancelTime_Btn: UIBarButtonItem!
    @IBOutlet weak var donetime_Btn: UIBarButtonItem!
    @IBOutlet weak var toolBar: UIToolbar!
    
    //Date picker
//    @IBOutlet weak var datePicker: UIDatePicker!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ishidden(bool: true)
        let dateFormatter2 = DateFormatter()
        dateFormatter2.dateFormat = "HH:mm a" //"hh:mm a"
        lblTime.text = dateFormatter2.string(from: timePicker.date)
        
    }
    
    @IBAction func selectTime_Action(_ sender: Any) {
        timePicker.datePickerMode = .time
        ishidden(bool: false)
    }
    
    @IBAction func timeCancel_Action(_ sender: Any) {
        ishidden(bool: true)
    }
    
    @IBAction func timeDoneBtn(_ sender: Any) {
        let dateFormatter1 = DateFormatter()
        dateFormatter1.dateFormat =  "HH:mm a"//"hh:mm"
        
        let str = dateFormatter1.string(from: timePicker.date)
        lblTime.text = str
        
        ishidden(bool: true)
        
    }
    
    func ishidden(bool:Bool){
           timePicker.isHidden = bool
           toolBar.isHidden = bool
       }
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
var dateFromStr = dateFormatter.date(from: "12:16:45")!

dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
//Output: 12:16:45 PM on January 01, 2000

dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
//Output: Sat, 1 Jan 2000 12:16:45 +0600

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//Output: 2000-01-01T12:16:45+0600

dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
//Output: Saturday, Jan 1, 2000

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
//Output: 01-01-2000 12:16

dateFormatter.dateFormat = "MMM d, h:mm a"
//Output: Jan 1, 12:16 PM

dateFormatter.dateFormat = "HH:mm:ss.SSS"
//Output: 12:16:45.000

dateFormatter.dateFormat = "MMM d, yyyy"
//Output: Jan 1, 2000

dateFormatter.dateFormat = "MM/dd/yyyy"
//Output: 01/01/2000

dateFormatter.dateFormat = "hh:mm:ss a"
//Output: 12:16:45 PM

dateFormatter.dateFormat = "MMMM yyyy"
//Output: January 2000

dateFormatter.dateFormat = "dd.MM.yy"
//Output: 01.01.00

//Output: Customisable AP/PM symbols
dateFormatter.amSymbol = "am"
dateFormatter.pmSymbol = "Pm"
dateFormatter.dateFormat = "a"
//Output: Pm

// Usage
var timeFromDate = dateFormatter.string(from: dateFromStr)
print(timeFromDate)
export const zeroPad = (num) => {
  var res = "0";
  if (String(num).length === 1) {
    res = `0${num}`;
  } else {
    res = num;
  }
  return res;
};