nsdateは年/月/日を取得します
-
02-10-2019 - |
質問
どうすれば年/月/日を取得できますか NSDate
オブジェクト、他の情報が与えられませんか?私はおそらくこれに似たことでこれを行うことができることを理解しています:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
しかし、それは、 NSDate
年/月/日。他に解決策はありますか?
解決
これはどうやら私の最も人気のある答えであるため、もう少し情報を含めるように編集しようとします。
その名前にもかかわらず、 NSDate
それ自体は、日付ではなく、機械時間のポイントを単にマークします。によって指定された時点の間に相関はありません NSDate
そして年、月、または日。そのためには、カレンダーを参照する必要があります。特定の時点は、見ているカレンダーに基づいて異なる日付情報を返します(たとえば、グレゴリオとユダヤ人のカレンダーの両方で日付は同じではありません)。世界 - 私は仮定しています - 私たちは少し偏っています NSDate
常に使用する必要があります。 NSDate
, 幸いなことに、はるかに超党派です。
日付と時刻を取得することは通過する必要があります NSCalendar
, 、あなたが言ったように、しかしそれをするためのより簡単な方法があります:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
それは生成します NSDateComponents
今日の現在のシステムカレンダーからの日、月、年を含むオブジェクト。 (ノート: これは必ずしも現在ではありません ユーザー指定 カレンダー、デフォルトのシステム1つ。)
もちろん、別のカレンダーまたは日付を使用している場合は、簡単に変更できます。利用可能なカレンダーとカレンダーユニットのリストは、 NSCalendar
クラス参照. 。詳細情報 NSDateComponents
に見つけることができます NSDateComponents
クラス参照.
参照のために、からの個々のコンポーネントへのアクセス NSDateComponents
かなり簡単です:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
あなたはただ気をつけなければなりません: NSDateComponents
その有効な情報でそれらを生成しない限り、あなたが要求するフィールドの有効な情報は含まれません(つまり、リクエスト NSCalendar
その情報を提供する NSCalendarUnit
s)。 NSDateComponents
それ自体に参照情報が含まれていません - それらはあなたがアクセスするための数字を保持する単純な構造です。たとえば、時代を取得したい場合は、 NSDateComponents
, 、ジェネレーターメソッドに供給する必要があります NSCalendar
とともに NSCalendarUnitEra
国旗。
他のヒント
NSDateFormatterを使用して、NSDateの個別のコンポーネントを取得できます。
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];
略語の代わりに月数を取得したい場合は、「mm」を使用します。整数を取得したい場合は、使用してください [myDayString intValue];
Itaiの優れた(そして機能している!)コードを言い換えるだけで、サンプルヘルパークラスがどのように見えるか、 年 特定のNSDATE変数の値。
ご覧のとおり、このコードを変更して月または日を取得するのは簡単です。
+(int)getYear:(NSDate*)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
return year;
}
(2013年に、このような独自の基本的なiOS日付関数を書かなければならないとは信じられません...)
もう1つ:2つのNSDATE値を比較するために<and>を使用しないでください。
Xcodeはそのようなコードを喜んで受け入れます(エラーや警告なし)が、その結果は宝くじです。君 しなければならない 「比較」関数を使用して、NSDATEを比較します。
if ([date1 compare:date2] == NSOrderedDescending) {
// date1 is greater than date2
}
Swift 2.0:
let date = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let components = calendar.components([.Month, .Day], fromDate: date)
let (month, day) = (components.month, components.day)
私はこの答えを書いています。なぜなら、それはあなたにオプションを与えない唯一のアプローチだからです NSDateComponent
変数および/またはこれらの変数をアンラッピングします(Swift 3の場合も)。
スウィフト3
let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)
Swift 2
let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)
ボーナススウィフト3楽しいバージョン
let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)
iOS 8の新機能
objc
NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];
迅速
let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)
iOS 8+をターゲットにしている場合は、新しいものを使用できます NSCalendar
より簡潔な形式でこれを達成するための利便性方法。
最初に作成します NSCalendar
そして、何でも使用します NSDate
必要とされている。
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
コンポーネントを個別に抽出できます component:fromDate:
NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
または、さらに簡潔に使用します NSInteger
経由のポインター getEra:year:month:day:fromDate:
NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];
詳細と例については、チェックしてください iOS 8では、nsdate操作が簡単になりました. 。免責事項、私は投稿を書きました。
iOS 8.0(およびOS x 10)の時点で、 成分 次のような単一の日付コンポーネントの取得を簡素化する方法:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
物事をより簡単にする必要があり、できればこれが効率的に実装されることを願っています。
NSDateから個々のNSDateComponentsを取得したい場合は、Itai Ferberによって提案されたソリューションが間違いなく必要になります。でももしあなたが欲しければ NSDateから直接NSStringに移動するには、nsdateFormatterを使用できます.
NSDate *currDate = [NSDate date];
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"%d/%d/%d", day, month, year);
これがSwiftの解決策です:
let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
// Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)
var (year, month, date) = (components.year, components.month, components.day)
これを試して 。 。 。
コードスニペット:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
それは今年、月、日付を与えます
以下を試してください:
NSString *birthday = @"06/15/1977";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSDate *date = [formatter dateFromString:birthday];
if(date!=nil) {
NSInteger age = [date timeIntervalSinceNow]/31556926;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
}
[formatter release];
Swift 2.x
extension NSDate {
func currentDateInDayMonthYear() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "d LLLL yyyy"
return dateFormatter.stringFromDate(self)
}
}
あなたはそれをとして使用することができます
NSDate().currentDateInDayMonthYear()
出力
6 March 2016
迅速
日付の要素をオプションの文字列として取得する簡単な方法。
extension Date {
// Year
var currentYear: String? {
return getDateComponent(dateFormat: "yy")
//return getDateComponent(dateFormat: "yyyy")
}
// Month
var currentMonth: String? {
return getDateComponent(dateFormat: "M")
//return getDateComponent(dateFormat: "MM")
//return getDateComponent(dateFormat: "MMM")
//return getDateComponent(dateFormat: "MMMM")
}
// Day
var currentDay: String? {
return getDateComponent(dateFormat: "dd")
//return getDateComponent(dateFormat: "d")
}
func getDateComponent(dateFormat: String) -> String? {
let format = DateFormatter()
format.dateFormat = dateFormat
return format.string(from: self)
}
}
let today = Date()
print("Current Year - \(today.currentYear)") // result Current Year - Optional("2017")
print("Current Month - \(today.currentMonth)") // result Current Month - Optional("7")
print("Current Day - \(today.currentDay)") // result Current Day - Optional("10")
私はこのようにします....
NSDate * mydate = [NSDate date];
NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate];
NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);
人間の読み取り可能な文字列(日、月、年)を取得するには、次のことができます。
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];