NSDate:将 UTC 值转换为军事时区值

NSDate: Convert UTC value to Military Time Zone Value

军事日期和时间的书写方式,又名军事日期时间组或 DTG,具有以下格式:

DDHHMMZMONYY

其中 DD = 日

HH = 小时(24 小时)

MM = 分钟

Z = 军事时区

MON = 月份

YY = 年

例如:2015 年 12 月 27 日,05:48+0200 在军事格式中将是:

270548BDEC15

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

我正在努力完成这个军事 style/formatting,目前我在 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 值转换为表示等效的军事值,以便我可以得到它?

270548BDEC15

我说话 swift 有点口吃,但我的建议是使用标准格式...

StartDTGDateFormatter.dateFormat = "ddkkmm X LLLyy"

... "X" 将给出格林威治标准时间 +00...+12、-01..-11 的小时数。这些空格将有助于解析...

let UpperCaseTAStartDTG = tempConvertedTAStartDTG.uppercaseString
let components = UpperCaseTAStartDTG.componentsSeparatedByString(" ")

...这将提供这样的数组...

(
    262050,
    "-08",  // California, USA
    DEC15
)

...标准位、从格林威治标准时间算起的小时数,以及标准位的其余部分。开发一个采用该数组的第二个元素并回答军区的函数应该是直截了当的。

请注意,数组响应 componentsJoinedByString(),因此应该很容易将其放回原处。

您可以使用自定义键和值创建一个字典,只获取时区 属性 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"