views:

178

answers:

2

When using the Date/Time picker on the iPhone/iPad, the year (yyyy) is stripped from the Date formatting in order to make room for the time.

How does it accomplish this based on the default unicode formats stored by the region format?

The formats do not necessarily match any of the following: NSDateFormatterLongStyle NSDateFormatterShortStyle NSDateFormatterMediumStyle NSDateFormatterFullStyle

Take the Bulgarian region format for instance. The formats are (respectively): dd MMMM y dd.MM.yy dd.MM.yyyy dd MM y, EEE

And United States: MMMM d, y M/d/yy MMM d, y EEEE, MMMM d, y

A Bulgarian date time picker displays: e.g. 06 10 cp

Where the United states display: e.g. Wed Oct 06

There is no Bulgarian format where the day name comes last, neither is there a format where the day name comes first in the US formats. This makes me wonder about languages where there are character following years and months.

  • How the heck does the date picker parse out the year properly given the formatting information available? And how does it know where to stick the day name?
  • Are there other date formats stored in the operating system (based on the user-selected region) that the date time picker retrieves?

Most importantly, how do I retrieve these dates formats from the locale?

I do not want to just throw in some ad-hoc format string - I need to extract the existing ones.

Thanks!

This is a follow up question after find out how to retrieve the actual unicode formats: http://stackoverflow.com/questions/3835882/objective-c-iphone-how-do-i-extract-the-actual-unicode-date-format-strings-for

A: 

You can specify date format by a string and then you can get relatively good results. For example:

    NSDateFormatter *timeFormat = [[[NSDateFormatter alloc] init] autorelease];
    [timeFormat setDateFormat:@"HH:mm:ss"];
    NSString *theTime = [timeFormat stringFromDate:[datePickerView date]];

The only difference is when you use US settings the first day is Sunday for EU it is monday bu you can handle that by NSCalendar firstWeekDay. Hope it can help.

a: AM/PM

A: 0~86399999 (Millisecond of Day)

 

c/cc: 1~7 (Day of Week)

ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat

cccc: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday

 

d: 1~31 (0 padded Day of Month)

D: 1~366 (0 padded Day of Year)

 

e: 1~7 (0 padded Day of Week)

E~EEE: Sun/Mon/Tue/Wed/Thu/Fri/Sat

EEEE: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday

 

F: 1~5 (0 padded Week of Month, first day of week = Monday)

 

g: Julian Day Number (number of days since 4713 BC January 1)

G~GGG: BC/AD (Era Designator Abbreviated)

GGGG: Before Christ/Anno Domini

 

h: 1~12 (0 padded Hour (12hr))

H: 0~23 (0 padded Hour (24hr))

 

k: 1~24 (0 padded Hour (24hr)

K: 0~11 (0 padded Hour (12hr))

 

L/LL: 1~12 (0 padded Month)

LLL: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec

LLLL: January/February/March/April/May/June/July/August/September/October/November/December

 

m: 0~59 (0 padded Minute)

M/MM: 1~12 (0 padded Month)

MMM: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec

MMMM: January/February/March/April/May/June/July/August/September/October/November/December

 

q/qq: 1~4 (0 padded Quarter)

qqq: Q1/Q2/Q3/Q4

qqqq: 1st quarter/2nd quarter/3rd quarter/4th quarter

Q/QQ: 1~4 (0 padded Quarter)

QQQ: Q1/Q2/Q3/Q4

QQQQ: 1st quarter/2nd quarter/3rd quarter/4th quarter

 

s: 0~59 (0 padded Second)

S: (rounded Sub-Second)

 

u: (0 padded Year)

 

v~vvv: (General GMT Timezone Abbreviation)

vvvv: (General GMT Timezone Name)

 

w: 1~53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year)

W: 1~5 (0 padded Week of Month, 1st day of week = Sunday)

 

y/yyyy: (Full Year)

yy/yyy: (2 Digits Year)

Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year)

YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year)

 

z~zzz: (Specific GMT Timezone Abbreviation)

zzzz: (Specific GMT Timezone Name)

Z: +0000 (RFC 822 Timezone)

Vanya
No, I do not need to know the possible format strings (I already looked that up). You cannot just assume a format for a language (some languages start with the year first or have special characters embedded in the date string -- e.g. es-ES has 'de' in it). Thanks anyway.
junkyspace
+2  A: 

Are there other date formats stored in the operating system (based on the user-selected region) that the date time picker retrieves?

Yes. From the UIDatePicker class documentation for the local property:

The default value is nil. which tells the date picker to use the current locale as returned by currentLocale (NSLocale) or the locale used by the date picker’s calendar. Locales encapsulate information about facets of a language or culture, such as the way dates are formatted.

Robot K
Thanks, but how do I extract the information from the Locale?
junkyspace
Try `+[NSDateFormatter dateFormatFromTemplate:options:locale:]`. There's example code at https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000447-SW53.
Robot K
Thanks, that worked... until I tried do it for Spanish; it uses the 'de' meaning 'of' (e.g. 5 of october of 2010). Basically I need to capture the each date format for the date picker (the initial button display, display button above the scrolling picker, and the scrolling picker itself), but it is inconsistent with the supplied styles (long, short, medium, and full). The date picker must do some hardcoded garbage or apple uses functionality not exposed in the api. Thanks anyway.
junkyspace