哪个Cocoa类方法将[NSDate]数据格式化为可排序的序列键文本字符串?
我需要一个适合包含在序列键中的日期戳作为排序日期记录文本文件的参数。我研究了苹果的文档,搜索了互联网,却找不到一个真正符合我标准的引用:一个格式化为 YYYY-MM-DD HH:MM:SS GMT 以24小时(军事)格式表示的小时数。因此,我必须编写自己的日期戳格式化方法,如图所示 内联注释有助于在断点处调试复杂的C代码,因为它的开销很低。这些注释包括由哪个Cocoa类方法将[NSDate]数据格式化为可排序的序列键文本字符串?,date,cocoa,format,Date,Cocoa,Format,我需要一个适合包含在序列键中的日期戳作为排序日期记录文本文件的参数。我研究了苹果的文档,搜索了互联网,却找不到一个真正符合我标准的引用:一个格式化为 YYYY-MM-DD HH:MM:SS GMT 以24小时(军事)格式表示的小时数。因此,我必须编写自己的日期戳格式化方法,如图所示 内联注释有助于在断点处调试复杂的C代码,因为它的开销很低。这些注释包括由[dateFormatter stringFromDate:date]生成的datetime字符串,以及所需日期戳格式的开发表示。带插入符号的注
[dateFormatter stringFromDate:date]
生成的datetime
字符串,以及所需日期戳格式的开发表示。带插入符号的注释指向扫描索引的当前位置
NSMutableString * sortableMilitaryDateTimeStamp()
{
NSString * datetime;
NSDate * date;
NSMutableString * sortableDate;
int d, sln, s, hr, x;
char c;
char inpbuffer[24]; char * src = (char *) &inpbuffer;
char dstbuffer[] = "....-..-.. ..:..:.. ...";
char * dst = (char *) &dstbuffer;
date = [NSDate date];
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
datetime = [dateFormatter stringFromDate:date];
sfrsTMC(src,datetime.UTF8String,24); //copies datetime text to the C string
// "June 2, 2018 at 3:04:46 PM GMT" to become "2018-06-02 15:04:46 GMT"
// ^
// "....-..-.....:..:......"
sln = strlen(src);
d = 0;
for (s = 0; (s <= sln) && (src[s] != ' '); s++) ;
c = src[0];
dst[5] = '0';
x = src[2];
switch (c) {
case 'J':
if (src[1] == 'a') dst[6] = '1';
else
if (x == 'l') dst[6] = '7';
else
if (x == 'n') dst[6] = '6';
break;
case 'F':
src[6] = '2';
break;
case 'M':
if (x == 'r') dst[6] = '3';
else
if (x == 'y') dst[6] = '5';
break;
case 'A':
if (src[1] == 'p') dst[6] = '4';
else
if (src[1] == 'u') dst[6] = '8';
break;
case 'S':
dst[6] = '9';
break;
case 'O':
dst[6] = '1'; dst[6] = '0';
break;
case 'N':
dst[6] = '1'; dst[6] = '1';
break;
case 'D':
dst[6] = '1'; dst[6] = '2';
break;
}
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
// "....-06-.. ..:..:.. ..."
if (src[s+2] = ',') {
dst[8] = '0';
dst[9] = src[++s]; }
else {
dst[8] = src[++s];
dst[9] = src[++s];
}
s += 3;
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
// "....-06-02 ..:..:.. ..."
d = 0;
for (x = 0; x < 4; x++) dst[d++] = src[s++];
s += 4;
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
// "2018-06-02 ..:..:.. ..."
if (src[s+1] == ':') {
dst[11] = '0';
hr = src[s] - '0';
dst[12] = src[s++]; }
else {
hr = src[s] - '0';
dst[11] = src[s++];
hr = (hr * 10) + src[s] - '0';
dst[12] = src[s++];
}
// "2018-06-02 03:..:.. ..."
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
d = 13;
for (x = 0; x < 7; x++) dst[d++] = src[s++];
// "2018-06-02 03:04:46 ..."
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
if (src[s] == 'P') {
hr += 12;
dst[11] = (int) (hr / 10) + '0';
dst[12] = (hr % 10) + '0';
}
s += 3;
// "2018-06-02 15:04:46 ..."
// June 2, 2018 at 3:04:46 PM GMT to 2018-06-02 15:04:46 GMT
// ^
d = 20;
for (x = 0; x < 4; x++) dst[d++] = src[s++];
// "2018-06-02 15:04:46 GMT"
sortableDate = @(dst).mutableCopy;
return sortableDate;
}
NSMutableString*sortableMilitaryDateTimeStamp()
{
NSString*日期时间;
NSDate*日期;
NSMutableString*可排序日期;
内部数据、sln、s、hr、x;
字符c;
char-inpbuffer[24];char*src=(char*)&inpbuffer;
字符dstbuffer[]=“…-…-…:…”;
char*dst=(char*)&dstbuffer;
日期=[NSDate date];
NSDateFormatter*dateFormatter=[[NSDateFormatter alloc]init];
[日期格式化程序setDateStyle:NSDateFormatterLongStyle];
[日期格式化程序setTimeStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
datetime=[dateFormatter stringFromDate:date];
sfrsTMC(src,datetime.UTF8String,24);//将datetime文本复制到C字符串
//“2018年6月2日格林尼治标准时间下午3:04:46”改为“2018-06-02 15:04:46格林尼治标准时间”
// ^
// "....-..-.....:..:......"
sln=strlen(src);
d=0;
对于(s=0;(s以下是调用格式化过程的要求:
NSMutableString * sortableDate;
NSDate * date = [NSDate date];
sortableDate = makeSortableDateTimeStamp(date);
NSMutableString * makeSortableDateTimeStamp (NSDate * date)
{
NSMutableString * datetime;
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'zzz"];
datetime = [dateFormatter stringFromDate:date].mutableCopy;
return datetime;
}
下面是格式化过程:
NSMutableString * sortableDate;
NSDate * date = [NSDate date];
sortableDate = makeSortableDateTimeStamp(date);
NSMutableString * makeSortableDateTimeStamp (NSDate * date)
{
NSMutableString * datetime;
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'zzz"];
datetime = [dateFormatter stringFromDate:date].mutableCopy;
return datetime;
}
setDataFormat:
字符串的编码在以下内容中指定:
有几个类似的unicode.org/reports涵盖了不同版本的开发。我选择这个是因为它被指定用于我的macOS和Xcode版本
再次感谢Willeke如此慷慨而精明的建议。使用setDateFormat:
来设置格式化程序的日期格式,而不是setDateStyle:
和setTimeStyle:
。我想我出于某种原因拒绝了这一点,但我现在会更加关注它。谢谢。@Willeke,我的英雄。我将把你建议的结果放在下面的“回答你的问题”区域。也许这会为其他人节省一些时间和不必要的工作。@Willeke这就是你建议的吗?它非常有效。谢谢。