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

时间:2015-12-27 04:26:12

标签: ios swift datetime nsdate nsdateformatter

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

DDHHMMZMONYY

其中DD = Day

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的 DEC15

2 个答案:

答案 0 :(得分:1)

我口口相声,但我的建议是使用标准格式......

pip install bitarray

......“X”将给出格林威治标准时间+00 ... + 12,-01 ..- 11的小时数。这些空格对解析...很有用。

StartDTGDateFormatter.dateFormat = "ddkkmm X LLLyy"

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

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

......标准位,GMT的小时数和标准位的其余部分。开发一个能够接受该阵列的第二个元素并回答军事区域的函数应该是直截了当的。

请注意,数组会响应( 262050, "-08", // California, USA DEC15 ) ,因此应该很容易将其重新组合在一起。

答案 1 :(得分:1)

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