军事日期和时间的书写方式(又称“军事日期时间组”或DTG)具有以下格式:

DDHHMMZMONYY

DD =天

HH =小时(24小时)

MM =分钟

Z =军事时区

MON =月

YY =年

例如:军事格式的2015年12月27日,05:48 +0200将为:

270548BDEC15

B等于UTC + 2(+0200)(关于UTC和相应的军事时区,请参见http://www.timeanddate.com/time/zones/military)

我正在尝试完成这种军事样式/格式设置,目前在Swift中有以下内容:

let StartDTG = NSDate()
let StartDTGDateFormatter = NSDateFormatter()

StartDTGDateFormatter.dateFormat = "ddkkmmZZZLLLyy"

let tempConvertedTAStartDTG = StartDTGDateFormatter.stringFromDate(StartDTG)

let UpperCaseTAStartDTG = tempConvertedTAStartDTG.uppercaseString

TAStartDTG.text = String(UpperCaseTAStartDTG)

该代码将采用当前日期和时间,并将其显示在文本字段中,如下所示:
270548+0200DEC15

问题:如何将ZZZ值转换为代表同等的军事价值,以便能够获得此价值?

270548 B DEC15

最佳答案

您可以使用您的自定义键和值创建字典,只需获取时区属性secondsFromGMT,将其除以3600,即可得到小时数偏移量,然后将其用作字典键来获取相应的时区值:

extension NSDate {
    struct Date {
        static let militaryZones: [Int:String] = {
            return [-12: "Y", -11: "X", -10: "W", -9: "V", -8: "U", -7: "T", -6: "S", -05: "R", -4: "Q", -3: "P", -2: "O", -1: "N", 0: "Z", 1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "K", 11: "L", 12: "M"]}()
        static let formatterMilitary: NSDateFormatter = {
            let formatter = NSDateFormatter()
            formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)
            formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
            formatter.dateFormat = "ddkkmm LLLyy"
            return formatter
        }()
    }
    var militaryTimeZone: String {
        return Date.militaryZones[NSTimeZone.localTimeZone().secondsFromGMT/3600] ?? ""
    }
    var militaryTime: String {
        return Date.formatterMilitary.stringFromDate(self)
            .componentsSeparatedByString(" ")
            .joinWithSeparator(militaryTimeZone)
            .uppercaseString
    }
}
NSDate().militaryTime      // "270455ODEC15"
NSDate().militaryTimeZone  // "O"

09-06 20:55