将NSDateComponents分配给标签

时间:2019-01-19 20:56:29

标签: swift

我正在创建一个倒计时到特定日期的移动应用程序。我认为我的计时器本身正确,但是我正在努力将其设置为可以将其分配给标签的格式。我收到错误消息“无法为类型为'(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
}

3 个答案:

答案 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)

尝试使用NSDateComponentsDate对象转换为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所评论的那样,您应该使用DateComponentsTimeZone等,而不是它们的NS(除非您使用Swift 2或较低)。

答案 2 :(得分:0)

形成日期需要做两件事:

  1. 在DateComponents实例上设置日历。
  2. 通过访问DateComponents实例上的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的文档,以了解如何将其转换为要显示的格式。