Как получить текущее время в качестве даты и времени
Только началось с детской площадки. Я пытаюсь создать простое приложение.
Я создал объект даты следующим образом:
var date = NSDate()
Как я могу получить текущий час? На других языках я могу сделать что-то вроде этого:
var hour = date.hour
Но я не могу найти какие-либо свойства / методы, подобные этому. Я нашел метод, dateWithCalendarFormat
, Должен ли я использовать это? Если так, КАК?
30 ответов
Обновление для 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
Смотрите тот же вопрос в target -c. Как получить часы и минуты от NSDate?
По сравнению с ответом Нейта, вы получите цифры, а не строки... выберите свой выбор!
Протестировано с Swift 4
Получение текущей даты и времени
Вы можете получить текущую дату и время так же просто, как это:
let currentDateTime = Date()
Тем не мение, Date
является 64-битным числом с плавающей запятой, измеряющим количество секунд с базовой даты 1 января 2001 года в 00:00:00 UTC. Я могу видеть это число для текущей даты и времени, используя
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")
Технические стандарты Unicode показывают другие форматы, которые DateFormatter
поддерживает.
Отображение даты и времени
Способ 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)
Имейте в виду, однако, что это для английского языка с регионом, установленным для США. Для других языков и регионов форматирование будет выглядеть иначе.
Дальнейшее обучение
Вы также можете использовать удобный метод 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)
Вы можете использовать быстрые 4 или 5, как показано ниже
let date = Date()
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = df.string(from: date)
Ouput будет как рев
2019-12-20 09:40:08
Swift 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-May-01 10:41:31
Swift 2 ответ:
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Hour, .Minute], fromDate: date)
let hour = components.hour
let minutes = components.minute
Свифт 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 - не уверен, что именно означает вопрос, принимая текущее время (и час) в качестве даты, но, надеюсь, вышесказанное должно объяснить достаточно, чтобы ответить на вопрос.
С Swift 3 и Swift 4, 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
Однострочный Swift 5.2
let date = String(DateFormatter.localizedString(from: NSDate() as Date, dateStyle:.medium, timeStyle:.short))
Если вам просто нужен час дня
let calendar = NSCalendar.currentCalendar()
var hour = calendar.component(.Hour,fromDate: 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 в коде таймера является именем класса.
В Свифте 3
let date = Date()
let calendar = Calendar.current()
let hour = calendar.component(.hour, from: date)
Я знаю, что есть много ответов, но я думаю, что мой может быть более удобным для многих
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)
}
}
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
Вы можете попробовать это
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))")
Расширяя эпически краткое решение noiiv, вот еще более краткая реализация Swift 3/4:
Swift 3/4
let components = Calendar.current.dateComponents([.hour, .minute], from: Date())
let (hour, minute) = (components.hour, components.minute)
Кроме того, расширяя расширение Leo Dabus, мы можем иметь:
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)
Вы можете использовать Swift4 или Swift 5, как показано ниже:
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
Swift 5
func printTimestamp() {
let timestamp = DateFormatter.localizedString(from: NSDate() as Date, dateStyle: .medium, timeStyle: .short)
print(timestamp)
}
и Вызов функции printTimestamp()
Только для даты в определенном формате
let dateFormatter1 = NSDateFormatter()
dateFormatter1.dateStyle = .MediumStyle
dateFormatter1.timeStyle = .NoStyle
dateFormatter1.dateFormat = "dd-MM-yyyy"
let date = dateFormatter1.stringFromDate(NSDate())
Свифт 5.5
Использование новогоDate.FormatStyle
(доступно в macOS 12.0+ и iOS 15.0+):
let hour = Date.now.formatted(.dateTime.hour()) // returns a String
Вы можете создать расширение на Date
Таким образом, вы можете легко вызвать его в других файлах. Вот пример расширения даты, которое использует вычисляемое свойство.
Он распечатает это: "Сегодня, 4:55 вечера"
extension Date {
var formatter: DateFormatter? {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .short
formatter.doesRelativeDateFormatting = true
return formatter
}
}
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 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
}
}
Вот расширение SWIFT, чтобы получить ваше текущее время местоположения устройства (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()
Если вам нужно отформатировать ответ определенным образом, вы можете легко использовать этот метод по умолчанию = "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")
Работает со Swift 5 (Xcode 10 и Xcode 11) (из Франции, 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"
Не забудьте добавить getCurrentDateTime()
на viewDidLoad
.
Вы можете получить от Dateformatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
для обновленной быстрой версии:
//Aug 7, 2023 at 2:54 PM
let timestamp = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)
Ниже приведен код последней быстрой версии (5):
func getTimestamp()-> String {
let timestamp = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)
return "\(timestamp)"
}