Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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日期时区问题_Swift_Date_Datetime_Dateformatter - Fatal编程技术网

Swift日期时区问题

Swift日期时区问题,swift,date,datetime,dateformatter,Swift,Date,Datetime,Dateformatter,好的,所以它对dateFormatter没有任何作用。date(from:sweDate)!)那么如何获取到目前为止的字符串值? 据我所知,Date不存储时区,因此无论我在格式化时使用的时区是什么,它都会打印UTC时间 那么解决方案是什么,因为我必须将本地日期与转换日期进行比较。我无法与字符串进行比较。 非常感谢您的帮助。您应该使用日历方法日期组件(在:时区中)检查不同时区中的相关日期组件,如下所示: extension Formatter { static let iso8601: D

好的,所以它对dateFormatter没有任何作用。date(from:sweDate)!)那么如何获取到目前为止的字符串值?

据我所知,Date不存储时区,因此无论我在格式化时使用的时区是什么,它都会打印UTC时间

那么解决方案是什么,因为我必须将本地日期与转换日期进行比较。我无法与字符串进行比较。
非常感谢您的帮助。

您应该使用日历方法
日期组件(在:时区中)
检查不同时区中的相关日期组件,如下所示:

extension Formatter {
    static let iso8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone.init(identifier: "America/New_York")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        return formatter
    }()
}
extension Date {
    var iso8601: String {
        return Formatter.iso8601.string(from: self)
    }
}

extension String {
    var dateFromISO8601: Date? {
        return Formatter.iso8601.date(from: self)   // "Mar 22, 2017, 10:22 AM"
    }
}



let dateFormat:String = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
let strDate: String = "2017-10-09T00:00:00.966Z"
if let dateFromString = strDate.dateFromISO8601
{
    print(dateFromString.iso8601)
}
let dateString=“2017-10-09T18:00:00.000Z”
let formatter=DateFormatter()
formatter.calendar=日历(标识符:.iso8601)
formatter.locale=locale(标识符:“en_US_POSIX”)
formatter.timeZone=时区(秒自GMT:0)
formatter.dateFormat=“yyyy-MM-dd'T'HH:MM:ss.sssxxx”
让日期=格式化程序。日期(从:日期字符串)!//巴西“2017年10月9日下午3:00”
//纽约“2017年10月9日下午2:00”
let components=Calendar.current.dateComponents(in:TimeZone(标识符:“America/New_York”)!,from:date)//日历:公历(固定)时区:America/New_York(固定)纪元:1年:2017年月份:10天:9小时:14分钟:0秒:0纳秒:0工作日:2工作日序号:2季度:0工作日月份:2工作日年份:41年工作日年份:2017 isLeapMonth:false

如果8.“yyy-MM-dd'T'HH:MM:ss.SSS'Z'”是错误的。通过跳过Z,它不会考虑日期字符串中的时区。Z表示UTC。如果您转义Z,它将把您的日期字符串解释为本地时间,这是错误的。您可以设置不同的时区,但在使用包含时区的日期格式解析日期时,它不会产生任何影响。
“yyy-MM-dd't'HH:MM:ss.SSSZ”
检查此项。您可以使用时区将日期转换为具有特定区域设置的字符串。@LeoDabus我认为Z没有问题,即使我转义为Z,它仍然输出错误的日期不要转义为Z,字符串中的Z表示UTC。与+0000相同检查我发布的链接,所以你的意思是我不需要将字符串转换为utc“Z”表示它已经在utc中了,对吗?它可以完美地工作,这对我很有帮助,谢谢@Leo Dabusits完美,但当我打印组件时。日期仍然是错误的
let dateString = "2017-10-09T18:00:00.000Z"
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
let date = formatter.date(from: dateString)!  // "Oct 9, 2017 at 3:00 PM" in Brazil
                                              // "Oct 9, 2017 at 2:00 PM" in New York
let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date)  //calendar: gregorian (fixed) timeZone: America/New_York (fixed) era: 1 year: 2017 month: 10 day: 9 hour: 14 minute: 0 second: 0 nanosecond: 0 weekday: 2 weekdayOrdinal: 2 quarter: 0 weekOfMonth: 2 weekOfYear: 41 yearForWeekOfYear: 2017 isLeapMonth: false

if 8..<16 ~= components.hour!  {
    print("store is open in NY").  // "store is open in NY\n"
}