サーチ…


構文

  • 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時間)を与える唯一の方法です。

その最後の文は重要です。これは、スケルトン要求にロケールの優先時間サイクルタイプを要求する唯一の方法です。 NSDateFormatterNSCalendarは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;
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow