军事日期和时间的书写方式(又称“军事日期时间组”或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"