我正在创建一个倒计时到特定日期的移动应用程序。我认为我的计时器本身正确,但是我正在努力将其设置为可以将其分配给标签的格式。我收到错误消息“无法为类型为'(NSDateComponents)'的参数列表调用类型为'String'的初始化程序。此错误在“ var date = String(openingGavelDate)”行中找到。标签的出口具有已在此文件中正确创建。
我采取的第一步是创建日期变量,并将其设置为等于其他变量的转换值。第二步涉及尝试浏览文档,但到目前为止,我还没有真正找到可以帮助您的大量文档。
func createGavelTimer() {
let openingGavelDate = NSDateComponents()
openingGavelDate.year = 2019
openingGavelDate.month = 7
openingGavelDate.day = 16
openingGavelDate.hour = 14
openingGavelDate.minute = 00
openingGavelDate.timeZone = NSTimeZone(abbreviation: "CST")! as TimeZone
var date = String(openingGavelDate) //problem is here
countdownLabel.text = date
}
答案 0 :(得分:1)
可能的解决方案之一:
let date = Calendar.current.date(from: openingGavelDate)
let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .medium
dateFormatter.doesRelativeDateFormatting = true
dateFormatter.timeZone = TimeZone(abbreviation: "CST")!
let yourString = dateFormatter.string(from: date)
答案 1 :(得分:0)
尝试使用NSDateComponents
将Date
对象转换为Calendar.date(from:)
,然后使用DateFormatter
将其转换为String
:
let gregorianCalendar = Calendar(identifier: .gregorian)
if let date = gregorianCalendar.date(from: openingGavelDate as DateComponents) {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
countdownLabel.text = dateFormatter.string(from: date)
}
另外,正如@Sh_Khan和@rmaddy所评论的那样,您应该使用DateComponents
,TimeZone
等,而不是它们的NS
(除非您使用Swift 2或较低)。
答案 2 :(得分:0)
形成日期需要做两件事:
date
属性来获取日期。此外,我建议使用时区标识符而不是缩写来指定时区;优点是标识符会自动应用特殊规则,例如适当的夏令时。 (下面我将“美国/芝加哥”区域替换为UTC。)
在操场上尝试以下代码:
var openingGavelDate = DateComponents()
let timeZone = TimeZone(identifier: "America/Chicago")!
openingGavelDate.year = 2019
openingGavelDate.month = 7
openingGavelDate.day = 16
openingGavelDate.hour = 14
openingGavelDate.minute = 00
openingGavelDate.calendar = Calendar.current
openingGavelDate.timeZone = timeZone
let date = openingGavelDate.date
print(date ?? "no date")
输出:2019-07-16 19:00:00 +0000
(您在格林尼治标准时间的日期。)
这将为您提供一个日期,但请注意,默认情况下,Date类以GMT打印,因为Date
没有时区的概念。
要在所需的时区和格式中打印date
,请使用DateFormatter
:
let f = DateFormatter()
f.dateFormat = "yyyy-MM-dd hh:mm a"
f.timeZone = TimeZone(identifier: "America/Chicago")!
print(f.string(from: date!))
输出:2019-07-16 02:00 PM
(您的日期和时间,采用CST格式,可读取)。
DateFormatter允许您自己控制格式,或按照用户的系统设置确定最终字符串中的内容。请参阅DateFormatter
的文档,以了解如何将其转换为要显示的格式。