似乎NSDateFormatter有一个"功能"意外地咬你:如果你做一个简单的"固定"格式操作,如:
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyyMMddHHmmss"];
NSString* dateStr = [fmt stringFromDate:someDate];
[fmt release];
Run Code Online (Sandbox Code Playgroud)
然后它在美国和大多数区域设置工作正常UNTIL ...将手机设置为24小时区域的人将设置中的12/24小时开关设置为12.然后上面开始将"AM"或"PM"添加到结果字符串的结尾.
(参见,例如,NSDateFormatter,我做错了什么或者这是一个错误?)
(请参阅https://developer.apple.com/library/content/qa/qa1480/_index.html)
显然苹果公司宣称这是"不好" - 破碎如设计,他们不会解决它.
规避显然是为特定区域(通常是美国)设置日期格式化程序的区域设置,但这有点乱:
NSLocale *loc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[df setLocale: loc];
[loc release];
Run Code Online (Sandbox Code Playgroud)
在onsies-twosies中并没有太糟糕,但我正在处理大约十个不同的应用程序,而我看到的第一个应用程序有43个这种情况的实例.
因此,对于宏/重写类/任何最小化改变所有内容的努力的任何聪明的想法,而不使代码模糊?(我的第一直觉是使用在init方法中设置语言环境的版本来覆盖NSDateFormatter.需要更改两行 - alloc/init行和添加的导入.)
这是我到目前为止所提出的 - 似乎适用于所有场景:
@implementation BNSDateFormatter
-(id)init {
static NSLocale* en_US_POSIX = nil;
NSDateFormatter* me = [super init];
if (en_US_POSIX == nil) {
en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
}
[me setLocale:en_US_POSIX];
return me;
}
@end …Run Code Online (Sandbox Code Playgroud) 我基本上需要分别获取当前日期和时间,格式为:
2009-04-26 11:06:54
生成以下代码,来自同一主题的另一个问题
now: |2009-06-01 23:18:23 +0100| dateString: |Jun 01, 2009 23:18| parsed: |2009-06-01 23:18:00 +0100|
这几乎是我正在寻找的,但我想分开日期和时间.
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMM dd, yyyy HH:mm"];
NSDate *now = [[NSDate alloc] init];
NSString *dateString = [format stringFromDate:now];
NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy"];
NSDate *parsed = [inFormat dateFromString:dateString];
NSLog(@"\n"
"now: |%@| \n"
"dateString: |%@| \n"
"parsed: |%@|", now, dateString, parsed);
Run Code Online (Sandbox Code Playgroud) 我如何从日期转换此日期时间?
由此:2016-02-29 12:24:26发布
于:2016年2月29日
到目前为止,这是我的代码,它返回一个nil值:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date: NSDate? = dateFormatter.dateFromString("2016-02-29 12:24:26")
print(date)
Run Code Online (Sandbox Code Playgroud) 2004-02-12T15:19:21+00:00在PHP中获取ISO 8601日期字符串(例如)很容易date('c'),但是如何在Objective-C(iPhone)中获取它?是否有类似的简短方法呢?
这是我发现的漫长道路:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Run Code Online (Sandbox Code Playgroud)
对于如此重要的事情来说,这似乎是一件非常艰难的事情.
我想得到NSDate整数形式的日,月和年组件,即如果日期是1/2/1988那么我应该分别得到1,2和1988作为整数.我怎么能在iOS中这样做?我发现了类似的问题,但方法是descriptionWithCalendarFormat:给出警告,现在似乎已被弃用了.
看起来像一个简单的事情,但我似乎无法找到一种方法来做到这一点.
看到几种不同的方法会很棒.
如何将此字符串"2016-04-14T10:44:00+0000"转换为NSDate并保留年,月,日,小时?
将T在它的中间真的抛出了什么,我使用日期,工作时.
我有一些代码用于排序日历日期,如下所示:
#if !(TARGET_IPHONE_SIMULATOR)
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
locale:[NSLocale currentLocale]];
[fmt setDateFormat:formatString];
#else
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif
Run Code Online (Sandbox Code Playgroud)
如果我在模拟器中运行它就可以了.如果我在设备上运行它,我会得到这个讽刺调试消息.
2012-09-19 22:40:13.972 APPNAME [4923:907]* - [__ NSCFCalendar组件:fromDate:]:日期不能为零
我的意思是,你觉得这个操作应该用零日期来表示什么?
目前已经避免了例外.
这个投诉会报告其中一些错误,然后进一步的违规行为只会默默地做任何随机的事情.这是此次发生的回溯(由于编译器优化,某些帧可能会丢失):
你必须嘲笑它,但我不确定我的dateFormatFromTemplate:代码有什么问题.任何帮助,将不胜感激.
运行Xcode V 4.5 btw
更新:
回溯:
0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1 - [MeetingsViewController dateAtBeginningOfDayForDate:] + 140
所以我猜我的dateAtBeginningOfDayForDate方法情况不好.看起来像这样:
/*
Break down a given NSDate to its bare components for sorting
*/
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
// Use the …Run Code Online (Sandbox Code Playgroud) 我有一个基本方法获取当前时间并将其设置为字符串.但是,如何在UNIX-1970时间戳格式的UNIX中格式化当前日期和时间?
这是我的代码:
NSDate *currentTime = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"hh-mm"];
NSString *resultString = [dateFormatter stringFromDate: currentTime];
Run Code Online (Sandbox Code Playgroud)
是否可以使用NSDateFormatter将'resultString'更改为时间戳?
我知道NSDateformatter功能套件对人类来说是一个福音,但同时它对我来说非常困惑.我希望你能帮助我.
在我的代码中,有一个代表一个月的int.所以:1将是1月,2月2日等.
在我的用户界面中,我想将此整数显示为正确的月份名称.此外,它应该遵守设备的区域设置.
感谢您的见解
与此同时,我做了以下工作:
int monthNumber = 11
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSDate* myDate = [dateFormatter dateFromString:dateString];
[dateFormatter release];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM"];
NSString *stringFromDate = [formatter stringFromDate:myDate];
[formatter release];
Run Code Online (Sandbox Code Playgroud)
这是这样做的方法吗?这看起来有点罗嗦.
nsdateformatter ×10
nsdate ×7
ios ×6
cocoa-touch ×3
cocoa ×2
iphone ×2
objective-c ×2
swift ×2
date ×1
datetime ×1
debugging ×1
iso8601 ×1
locale ×1
nscalendar ×1
numbers ×1