如何获得当前时间为datetime

从操场开始。我正在尝试创建一个简单的应用程序。

我创建了一个date对象,就像这样:

var date = NSDate()

我怎样才能得到当前的时间?在其他语言中,我可以这样做:

var hour = date.hour

但我找不到任何这样的属性/方法。我找到了一个方法,dateWithCalendarFormat。我应该用这个吗?如果是,怎么做?

593934 次浏览

Swift 3更新:

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)

我是这样做的:

let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date)
let hour = components.hour
let minutes = components.minute

在objective-c 我如何从NSDate得到小时和分钟?中可以看到同样的问题

和Nate的答案相比,你得到的是数字,而不是字符串……

你也可以使用NSDateFormatter的方便方法,例如:

func printTimestamp() {
let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"

Swift让创建和使用扩展变得非常容易。我创建了一个sharedCode.swift文件,并在其中放入枚举、扩展名和其他有趣的东西。我创建了一个NSDate扩展来添加一些典型的功能,这是费力和丑陋的输入一遍又一遍:

extension NSDate
{
func hour() -> Int
{
//Get Hour
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.Hour, fromDate: self)
let hour = components.hour


//Return Hour
return hour
}




func minute() -> Int
{
//Get Minute
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.Minute, fromDate: self)
let minute = components.minute


//Return Minute
return minute
}


func toShortTimeString() -> String
{
//Get Short Time String
let formatter = NSDateFormatter()
formatter.timeStyle = .ShortStyle
let timeString = formatter.stringFromDate(self)


//Return Short Time String
return timeString
}
}

使用这个扩展,你现在可以做一些事情,如:

        //Get Current Date
let currentDate = NSDate()


//Test Extensions in Log
NSLog("(Current Hour = \(currentDate.hour())) (Current Minute = \(currentDate.minute())) (Current Short Time String = \(currentDate.toShortTimeString()))")

在上午11:51会写出来:

(当前小时= 11)(当前分钟= 51)(当前短时间字符串= 11:51 AM)

迅速回答:

 let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Hour, .Minute], fromDate: date)
let hour = components.hour
let minutes = components.minute

如果你只需要一天中的一小时

let calendar = NSCalendar.currentCalendar()
var hour = calendar.component(.Hour,fromDate: NSDate())

使用Swift 4进行测试

获取当前日期和时间

您可以像这样简单地获取当前日期和时间:

let currentDateTime = Date()

然而,Date是一个64位浮点数,测量自2001年1月1日00:00:00 UTC的引用日期以来的秒数。我可以通过使用查看当前datetime的数字

Date().timeIntervalSinceReferenceDate

在撰写本文时,它返回497626515.185066,可能不是你正在寻找的。继续阅读。

正在创建另一个日期和时间

方法1

如果您知道引用日期之前或之后的秒数,则可以使用它。

let someOtherDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

方法2

当然,使用年、月、日和小时(而不是相对秒)之类的东西来创建Date会更容易。为此,你可以使用DateComponents来指定组件,然后使用Calendar来创建日期。Calendar给出了Date上下文。否则,它怎么知道要用哪个时区或日历来表示呢?

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34


// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)

其他时区缩写可以在在这里中找到。如果将其保留为空,则默认为使用用户的时区。

方法3

最简洁的方法(但不一定是最好的)可能是使用DateFormatter

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

DateFormatter支持的Unicode技术标准显示其他格式

显示日期和时间

方法1

如果你只想显示日期或时间的某些组件,你可以使用CalendarUnit来指定你想从Date中提取的组件。

// get the current date and time
let currentDateTime = Date()


// get the user's calendar
let userCalendar = Calendar.current


// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
.year,
.month,
.day,
.hour,
.minute,
.second
]


// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)


// now the components are available
dateTimeComponents.year   // 2016
dateTimeComponents.month  // 10
dateTimeComponents.day    // 8
dateTimeComponents.hour   // 22
dateTimeComponents.minute // 42
dateTimeComponents.second // 17

也请参见这个答案

方法2

方法1为您提供了组件,但是为每种样式、语言和地区格式化这些数字需要做很多工作。你不需要这么做。这已经在DateFormatter类中为你完成了。

// get the current date and time
let currentDateTime = Date()


// initialize the date formatter and set the style
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .long


// get the date time String from the date object
formatter.string(from: currentDateTime) // October 8, 2016 at 10:48:53 PM

下面是上面代码的延续,显示了更多的格式化选项:

// "10/8/16, 10:52 PM"
formatter.timeStyle = .short
formatter.dateStyle = .short
formatter.string(from: currentDateTime)


// "Oct 8, 2016, 10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .medium
formatter.string(from: currentDateTime)


// "October 8, 2016 at 10:52:30 PM GMT+8"
formatter.timeStyle = .long
formatter.dateStyle = .long
formatter.string(from: currentDateTime)


// "October 8, 2016"
formatter.timeStyle = .none
formatter.dateStyle = .long
formatter.string(from: currentDateTime)


// "10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .none
formatter.string(from: currentDateTime)

但是请记住,这是针对英语的,区域设置为美国。对于其他语言和地区,格式看起来会有所不同。

进一步的研究

你可以试试这个

func getTime() -> (hour:Int, min:Int, sec:Int) {
let currentDateTime = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Hour,.Minute,.Second], fromDate: currentDateTime)
let hour = components.hour
let min = components.minute
let sec = components.second
return (hour,min,sec)
}

现在调用该方法并接收带有小时、分钟和秒的日期

    let currentTime = self.getTime()
print("Hour: \(currentTime.hour) Min: \(currentTime.min) Sec: \(currentTime.sec))")

在Swift 3中,

    let date = Date()
let calendar = Calendar.current()


let hour = calendar.component(.hour, from: date)

斯威夫特3:

static func currentTime() -> String {
let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)
return "\(hour):\(minutes)"
}

PS -不确定将当前时间(和小时)作为日期时间是什么意思,但希望上面的解释足以回答这个问题。

仅用于特定格式的日期

    let dateFormatter1 = NSDateFormatter()
dateFormatter1.dateStyle = .MediumStyle
dateFormatter1.timeStyle = .NoStyle
dateFormatter1.dateFormat = "dd-MM-yyyy"
let date = dateFormatter1.stringFromDate(NSDate())

使用Date Formatter -Swift 3.0

//Date
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
labelfordate.text = String(dateString)




//Time
let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .medium
let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
labelfortime.text = String(timeString)

每秒钟更新一次日期和时间

override func viewDidLoad() {
super.viewDidLoad()


timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(DateAndTime.action), userInfo: nil, repeats: true)


}


func action()
{
//Date
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
labelfordate.text = String(dateString)




//Time
let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .medium
let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
labelfortime.text = String(timeString)


}

注意:定时器代码中的DateAndTime是类名。

Xcode 8.2.1•Swift 3.0.2

extension Date {
var hour: Int { return Calendar.autoupdatingCurrent.component(.hour, from: self) }
}

let date = Date()      // "Mar 16, 2017, 3:43 PM"
let hour = date.hour   // 15

在Swift 5中,Foundation提供了许多从Date对象获取小时值的方法。根据您的需要,您可以从以下四个Playground代码片段中选择一个。


# 1。使用Calendar dateComponents(_:from:)方法

Calendar有一个叫做dateComponents(_:from:)的方法。dateComponents(_:from:)有以下声明:

func dateComponents(_ components: Set<Calendar.Component>, from date: Date) -> DateComponents

使用日历时区返回日期的所有日期组件。

用法:

import Foundation


let date = Date()
let dateComponents = Calendar.current.dateComponents([.hour], from: date)
let hour = dateComponents.hour
print(String(describing: hour)) // may print: Optional(13)

# 2。使用Calendar component(_:from:)方法

Calendar有一个叫做component(_:from:)的方法。component(_:from:)有以下声明:

返回日期的一个组件的值。

func component(_ component: Calendar.Component, from date: Date) -> Int

用法:

import Foundation


let date = Date()
let hour = Calendar.current.component(.hour, from: date)
print(hour) // may print: 13

# 3。使用DateFormatter dateFormat属性

DateFormatter有一个名为dateFormat的属性。dateFormat有以下声明:

var dateFormat: String! { get set }

接收方使用的日期格式字符串。

用法:

import Foundation


let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH"
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13

# 4。使用Dateformatter setLocalizedDateFormatFromTemplate(_:)方法

Dateformatter有一个叫做setLocalizedDateFormatFromTemplate(_:)的方法。setLocalizedDateFormatFromTemplate(_:)有以下声明:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

使用指定区域设置接收方的模板的日期格式。

用法:

import Foundation


let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("HH")
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13

你可以从Dateformatter获取

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)

你可以在Date上创建一个扩展,这样你就可以很容易地在其他文件中调用它。下面是一个使用计算属性的日期扩展示例。

它会打印出来:“今天,下午4:55”

extension Date {


var formatter: DateFormatter? {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .short
formatter.doesRelativeDateFormatting = true


return formatter
}
}

我知道有很多答案,但我认为我的答案对许多人来说可能更方便

extension String {
init(epoch: Double) {
let date = Date(timeIntervalSince1970: epoch)


let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy HH:mm:ssZZZ"


self = dateFormatter.string(from: date)
}
}

斯威夫特4

let dateFormatter : DateFormatter = DateFormatter()
//  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
let date = Date()
let dateString = dateFormatter.string(from: date)
let interval = date.timeIntervalSince1970

输出

2018 - 5月- 01 10:41:31

这里是斯威夫特扩展,以获得您当前的设备位置时间(GMT)。

func getGMTTimeDate() -> Date {
var comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
comp.calendar = Calendar.current
comp.timeZone = TimeZone(abbreviation: "GMT")!
return Calendar.current.date(from: comp)!
}

现在得到时间:-

Date().getGMTTimeDate()

如果你需要以一种特定的方式格式化答案,你可以很容易地使用这个方法,default = "dd-MM-yyyy"。

extension Date {


func today(format : String = "dd-MM-yyyy") -> String{
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: date)
}
}

获取今天的日期现在可以使用

Date().today() or Date().today("dd/MM/yyyy")

斯威夫特4:

extension Date
{
func hour() -> Int
{
//Get Hour
let calendar = Calendar.current
let components = calendar.component(.hour, from: self)
let hour = components


//Return Hour
return hour
}




func minute() -> Int
{
//Get Minute
let calendar = Calendar.current
let components = calendar.component(.minute, from: self)
let minute = components


//Return Minute
return minute
}
}

扩展Noiiv史诗般的简洁解决方案,这里是更简洁的Swift 3/4实现:

斯威夫特3/4

let components = Calendar.current.dateComponents([.hour, .minute], from: Date())
let (hour, minute) = (components.hour, components.minute)

同样,在里奥·达布斯的分机上展开,我们可以得到:

extension Date {


func components(_ components: Set<Calendar.Component>) -> DateComponents {
return Calendar.current.dateComponents(components, from: self)
}


func component(_ component: Calendar.Component) -> Int {
return Calendar.current.component(component, from: self)
}


var era: Int { return component(.era) }
var year: Int { return component(.year) }
var month: Int { return component(.month) }
var day: Int { return component(.day) }
var hour: Int { return component(.hour) }
var minute: Int { return component(.minute) }
var second: Int { return component(.second) }
var weekday: Int { return component(.weekday) }
var weekdayOrdinal: Int { return component(.weekdayOrdinal) }
var quarter: Int { return component(.quarter) }
var weekOfMonth: Int { return component(.weekOfMonth) }
var weekOfYear: Int { return component(.weekOfYear) }
var yearForWeekOfYear: Int { return component(.yearForWeekOfYear) }
var nanosecond: Int { return component(.nanosecond) }
var calendar: Calendar? { return components([.calendar]).calendar }
var timeZone: TimeZone? { return components([.timeZone]).timeZone }


}

像这样使用它:

let date = Date()
let (hour, minute) = (date.hour, date.minute)
func getCurrentDate() -> Date {
let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateInString  = dateFormatter.string(from: date)
let dateinDate = dateFormatter.date(from: dateInString)
return dateinDate!
}

工作与Swift 5 (Xcode 10 &Xcode 11 (from France UTC)

func getCurrentDateTime() {
let now = Date()
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "fr_FR")
formatter.dateFormat = "EEEE dd MMMM YYYY HH:mm"
myLabel.text = formatter.string(from: now)
myLabel.font = UIFont(name: "HelveticaNeue-Light", size: 12)
myLabel.textColor = UIColor.black
}

如果你想只显示日期,设置formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

若要只显示小时,将formatter.dateFormat改为

formatter.dateFormat = "HH:mm"

别忘了在viewDidLoad上添加getCurrentDateTime()

斯威夫特5

func printTimestamp() {
let timestamp = DateFormatter.localizedString(from: NSDate() as Date, dateStyle: .medium, timeStyle: .short)
print(timestamp)
}

和调用函数printTimestamp()

你可以用swift 4或5像bellow

let date = Date()
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = df.string(from: date)

输出将像波纹管

2019-12-20 09:40:08

你可以使用Swift4或swif5如下所示:

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let current_date = dateFormatter.string(from: date)
print("current_date-->",current_date)

输出:

2020-03-02

一行斯威夫特5.2

let date = String(DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short))

以下代码是最新的swift版本(5):

func getTimestamp()-> String {
let timestamp = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)
return "\(timestamp)"
}