サーチ…
構文
- NSDate()// NSDateオブジェクトのinitを現在の日付と時刻に変換する
- NSDate()。timeIntervalSince1970 //現在の日付と時刻(1970年1月1日00:00:00 UTCからの秒数)。
- NSDate()。compare(other:NSDate)//現在の日付と別の日付との比較を返します
NSComparisonResult
備考
あなたが設定できるさまざまなタイプの日付フォーマットがあります:ここにそれらの完全なリストがあります。
フォーマット | 意味/説明 | 例1 | 例2 |
---|---|---|---|
y | 少なくとも1桁の年。 | 175 AD→ "175" | 2016 AD→ "2016" |
yy | 正確に2桁の年。 | 5 AD→ "05" | 2016 AD→ "16" |
yyy | 少なくとも3桁の年。 | 5 AD→ "005" | 2016 AD→ "2016" |
yyyy | 少なくとも4桁の年。 | 5 AD→ "0005" | 2016 AD→ "2016" |
M | 少なくとも1桁の月。 | 7月→「7」 | 「11月」→「11」 |
MM | 少なくとも2桁の月。 | 7月→「07」 | 「11月」→「11」 |
うーん | 3文字の月の略語。 | 7月→「7月」 | "11月"→ "11月" |
んー | 月のフルネーム。 | 7月→「7月」 | "11月"→ "11月" |
MMMMM | 1文字の月の略語(1月、6月、7月はすべて「J」を持つ)。 | 7月→「J」 | "11月"→ "N" |
d | 少なくとも1桁の日。 | 8→ "8" | 29→29 |
DD | 少なくとも2桁の日。 | 8→ "08" | 29→29 |
"E"、 "EE"、または "EEE" | day nameの3文字の略語。 | 月曜日→ "月" | 木曜日→「木」 |
EEEE | 終日の名前。 | 月曜日→ "月曜日" | 木曜日→ "木曜日" |
EEEEE | day nameの1文字の略語(ThuとTueは 'T'になります) | 月曜日→ "M" | 木曜日→ "T" |
EEEEEE | day nameの2文字の略語。 | 月曜日→ "Mo" | 木曜日→ "Th" |
a | 期間(AM / PM)。 | 午後10時→ "PM" | 2 AM→ "AM" |
h | 少なくとも1桁の1〜12時間に相当する時間。 | 午後10時→ "10" | 午前2時→ "2" |
hh | 少なくとも2桁の1〜12時間単位。 | 午後10時→ "10" | 2時→ "02" |
H | 少なくとも1桁の0-23時間に相当する時間。 | 午後10時→ "14" | 午前2時→ "2" |
HH | 少なくとも2桁の0-23時間に相当する時間。 | 午後10時→ "14" | 2時→ "02" |
m | 少なくとも1桁の分。 | 7→ "7" | 29→29 |
mm | 少なくとも2桁の分。 | 7→ "07" | 29→29 |
s | 少なくとも1桁の秒です。 | 7→ "7" | 29→29 |
SS | 少なくとも2桁の秒。 | 7→ "07" | 29→29 |
ゾーン(z)に基づいて異なる時間を得るために、ミリ秒の詳細(S)などで時間を得るために、さらに多くのものがあります。
現在の日付を取得する
現在の日付を取得するのはとても簡単です。次のように、現在の日付のNSDateオブジェクトを1行で取得します。
迅速
var date = NSDate()
スウィフト3
var date = Date()
目標-C
NSDate *date = [NSDate date];
NSDateオブジェクトを現在の日付からN秒間取得する
新しい日付の現在の日付と時刻からの秒数。負の値を使用して、現在の日付より前の日付を指定します。
このために、 dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate
(Swift)または+ (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds
(Objective-C)という+ (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds
ます。
たとえば、現在の日付から1週間、現在の日付から1週間の日付が必要な場合は、次のようにすることができます。
迅速
let totalSecondsInWeek:NSTimeInterval = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
let nextWeek = NSDate().dateWithTimerIntervalSinceNow(totalSecondsInWeek)
//Using positive value for future date from today
let lastWeek = NSDate().dateWithTimerIntervalSinceNow(-totalSecondsInWeek)
スウィフト3
let totalSecondsInWeek:TimeInterval = 7 * 24 * 60 * 60;
//Using positive value to add to the current date
let nextWeek = Date(timeIntervalSinceNow: totalSecondsInWeek)
//Using negative value to get date one week from current date
let lastWeek = Date(timeIntervalSinceNow: -totalSecondsInWeek)
目標-C
NSTimeInterval totalSecondsInWeek = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
NSDate *lastWeek = [NSDate dateWithTimeIntervalSinceNow:-totalSecondsInWeek];
//Using positive value for future date from today
NSDate *nextWeek = [NSDate dateWithTimeIntervalSinceNow:totalSecondsInWeek];
NSLog(@"Last Week: %@", lastWeek);
NSLog(@"Right Now: %@", now);
NSLog(@"Next Week: %@", nextWeek);
日付比較
日付の比較には4つの方法があります。
迅速
-
isEqualToDate(anotherDate: NSDate) -> Bool
-
earlierDate(anotherDate: NSDate) -> NSDate
-
laterDate(anotherDate: NSDate) -> NSDate
-
compare(anotherDate: NSDate) -> NSComparisonResult
目標-C
-
- (BOOL)isEqualToDate:(NSDate *)anotherDate
-
- (NSDate *)earlierDate:(NSDate *)anotherDate
-
- (NSDate *)laterDate:(NSDate *)anotherDate
-
- (NSComparisonResult)compare:(NSDate *)anotherDate
2つの日付があるとしましょう:
迅速
let date1: NSDate = ... // initialized as July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as July 2, 2016 00:00:00
目標-C
NSDate *date1 = ... // initialized as July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as July 2, 2016 00:00:00
次に、それらを比較するために、このコードを試してみましょう:
迅速
if date1.isEqualToDate(date2) {
// returns false, as both dates aren't equal
}
earlierDate: NSDate = date1.earlierDate(date2) // returns the earlier date of the two (date 2)
laterDate: NSDate = date1.laterDate(date2) // returns the later date of the two (date1)
result: NSComparisonResult = date1.compare(date2)
if result == .OrderedAscending {
// true if date1 is earlier than date2
} else if result == .OrderedSame {
// true if the dates are the same
} else if result == .OrderedDescending {
// true if date1 is later than date1
}
目標-C
if ([date1 isEqualToDate:date2]) {
// returns false, as both date are not equal
}
NSDate *earlierDate = [date1 earlierDate:date2]; // returns date which comes earlier from both date, here it will return date2
NSDate *laterDate = [date1 laterDate:date2]; // returns date which comes later from both date, here it will return date1
NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
// fails
// comes here if date1 is earlier then date2, in our case it will not come here
} else if (result == NSOrderedSame){
// fails
// comes here if date1 is same as date2, in our case it will not come here
} else{ // NSOrderedDescending
// succeeds
// comes here if date1 is later than date2, in our case it will come here
}
日付を比較し、秒、週、月、年を処理する場合は、次のようにします。
スウィフト3
let dateStringUTC = "2016-10-22 12:37:48 +0000"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X"
let date = dateFormatter.date(from: dateStringUTC)!
let now = Date()
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.maximumUnitCount = 2
let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")
または、各コンポーネントにこれを使用できます。
// get the current date and time
let currentDateTime = Date()
// get the user's calendar
let userCalendar = Calendar.current
// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
.year,
.month,
.day,
.hour,
.minute,
.second
]
// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)
// now the components are available
dateTimeComponents.year
dateTimeComponents.month
dateTimeComponents.day
dateTimeComponents.hour
dateTimeComponents.minute
dateTimeComponents.second
Unixエポック時間を取得する
Unixエポックタイムを取得するには、定数timeIntervalSince1970
使用しtimeIntervalSince1970
。
迅速
let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970
目標-C
NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];
NSDateFormatter
NSDate
オブジェクトを文字列に変換するのは3つのステップです。
1. NSDateFormatter
オブジェクトを作成する
迅速
let dateFormatter = NSDateFormatter()
スウィフト3
let dateFormatter = DateFormatter()
目標-C
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
2.文字列を入力する日付形式を設定します
迅速
dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"
目標-C
dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";
3.フォーマットされた文字列を取得する
迅速
let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
スウィフト3
let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
目標-C
NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];
これにより、次のような出力が得られます2001-01-02 at 13:00
注意
NSDateFormatter
インスタンスの作成はコストのかかる操作なので、一度作成して可能な限り再利用することをお勧めします。
日付を文字列に変換するのに便利な拡張機能。
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd yyyy"
return dateFormatter.string(from: self)
}
}
迅速な日付作成のための便利なリンクは、 人間が読めるようになっているnsdateformatterです。
日付書式を作成するには、 日付書式パターンを参照してください。
時と分(のみ)から完全なNSDateに構成されたNSDateを変換する
サーバーから文字列として返され、これらの値だけで NSDateインスタンスを開始する場合は、08:12のように1時間と分の形式のNSDateを作成したケースが多くあります。
この状況の欠点は、あなたのNSDateがほぼ完全に "裸"であることと、このオブジェクトが他のNSDateタイプと "一緒に遊ぶ"ために、日、月、年、秒、およびタイムゾーンを作成することです。
この例では、hourAndMinuteは時および分形式で構成されたNSDate型です。
目標-C
NSDateComponents *hourAndMinuteComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute
fromDate:hourAndMinute];
NSDateComponents *componentsOfDate = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
fromDate:[NSDate date]];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay: componentsOfDate.day];
[components setMonth: componentsOfDate.month];
[components setYear: componentsOfDate.year];
[components setHour: [hourAndMinuteComponents hour]];
[components setMinute: [hourAndMinuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];
NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];
今あなたのオブジェクトは「裸」になっているのとは全く反対のものです。
UTC TimeZoneでのNSDateからの時間オフセット
ここでは、現在のデータから希望のタイムゾーンのUTC
時間オフセットを計算します。
+(NSTimeInterval)getUTCOffSetIntervalWithCurrentTimeZone:(NSTimeZone *)current forDate:(NSDate *)date {
NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSInteger currentGMTOffset = [current secondsFromGMTForDate:date];
NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;
return gmtInterval;
}
タイムサイクルタイプを取得する(12時間または24時間)
現在の日付にAMまたはPMのシンボルが含まれているかどうかを確認する
目標-C
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);
NSDateFormatter
からのタイムサイクルタイプの要求
目標-C
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;
これはICUのSpecに従って、 "j"と呼ばれる特殊な日付テンプレート文字列を使用します...
[...]は、補足データの時間要素の優先属性によって決定されるロケール(h、H、K、またはk)の優先時間形式を要求します。 [...] APIに渡されるスケルトンで 'j'を使用するのは、スケルトン要求にロケールの優先時間サイクルタイプ(12時間または24時間)を与える唯一の方法です。
その最後の文は重要です。これは、スケルトン要求にロケールの優先時間サイクルタイプを要求する唯一の方法です。 NSDateFormatter
とNSCalendar
はICUライブラリ上に構築されているので、ここでも同じことが言えます。
参照
2番目の選択肢は、 この答えから得られたものです。
JSON日付形式からNSDateを取得する "/ Date(1268123281843)/"
以前のJson.NET 4.5の日付は、 "/ Date(1198908717056)/"のMicrosoft形式で書かれていました。サーバーがこの形式で日付を送信する場合は、次のコードを使用してNSDateにシリアル化できます。
目標-C
(NSDate*) getDateFromJSON:(NSString *)dateString
{
// Expect date in this format "/Date(1268123281843)/"
int startPos = [dateString rangeOfString:@"("].location+1;
int endPos = [dateString rangeOfString:@")"].location;
NSRange range = NSMakeRange(startPos,endPos-startPos);
unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
NSLog(@"%llu",milliseconds);
NSTimeInterval interval = milliseconds/1000;
NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];
// add code for date formatter if need NSDate in specific format.
return date;
}
NSDateから歴史的な時間を得る(例:5s前、2m前、3h前)
これは、最新のフィードにタイムスタンプが必要なさまざまなチャットアプリケーション、RSSフィード、ソーシャルアプリで使用できます:
目標-C
- (NSString *)getHistoricTimeText:(NSDate *)since
{
NSString *str;
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:since];
if(interval < 60)
str = [NSString stringWithFormat:@"%is ago",(int)interval];
else if(interval < 3600)
{
int minutes = interval/60;
str = [NSString stringWithFormat:@"%im ago",minutes];
}
else if(interval < 86400)
{
int hours = interval/3600;
str = [NSString stringWithFormat:@"%ih ago",hours];
}
else
{
NSDateFormatter *dateFormater=[[NSDateFormatter alloc]init];
[dateFormater setLocale:[NSLocale currentLocale]];
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM d, YYYY" options:0 locale:[NSLocale currentLocale]];
[dateFormater setDateFormat:dateFormat];
str = [dateFormater stringFromDate:since];
}
return str;
}