-(NSDate *)beginningOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
}
-(NSDate *)endOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
}
Ketika saya menelepon: [self endOfDay: [NSDate date]]; Saya mendapatkan yang pertama setiap bulan ... Mengapa begitu? Saya menggunakan dua metode ini karena saya memerlukan interval dari detik pertama dari tanggal pertama (startingOfDay: date1) hingga detik terakhir dari tanggal kedua (endOfDay: Date2) ...
ios
nsdate
nsdatecomponents
pengguna1028028
sumber
sumber
Jawaban:
Anda hilang
NSDayCalendarUnit
disumber
Awal Hari / Akhir Hari - Swift 4
sumber
NSYearCalendarUnit
,NSMonthCalendarUnit
, DanNSDayCalendarUnit
telah usang sebagai iOS 8. GunakanNSCalendarUnitYear
,NSCalendarUnitMonth
, danNSCalendarUnitDay
sebagai gantinya!Swift 5 Jawaban sederhana dan lebih tepat.
Waktu mulai: 00:00:00
Waktu berakhir: 23: 59: 59,5
Tambahan
sumber
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?Di iOS 8+ ini sangat nyaman; Anda dapat melakukan:
Untuk mengetahui penghujung hari, cukup gunakan metode NSCalendar selama 23 jam, 59 menit, 59 detik, tergantung bagaimana Anda menentukan akhir hari.
Tanggal Matematika
Dokumentasi NSCalendar Apple iOS . (Lihat Bagian: Perhitungan Kalender )
Metode NSCalendar dibahas oleh NSHipster .
sumber
Ekstensi Swift saya untuk NSDate:
Swift 1.2.0
Swift 2.0
sumber
Swift 5.1 - XCode 11 dengan
Date
kelas, bukanNSDate
danCalender
sebagai gantiNSCalender
Pemakaian:
sumber
Date
ketika saya mencobanya di taman bermainimport UIKit
?Anda tidak perlu menyiapkan komponen ke nol, abaikan saja:
sumber
[calendar startOfDayForDate:date]
tetapi-endOfDayForDate:
sayangnya tidak ada ...Bagi saya tidak ada jawaban di sini dan di mana pun pada stackoverflow bekerja. Untuk memulai hari ini saya melakukan ini.
Catat ini
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
dan[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Saat kalender dibuat, kalender diinisialisasi dengan zona waktu saat ini dan ketika tanggal diambil dari komponennya, karena NSDate tidak memiliki zona waktu, tanggal dari zona waktu saat ini dianggap sebagai zona waktu UTC. Jadi kita perlu menyetel zona waktu sebelum mengekstrak komponen dan nanti saat mengekstrak tanggal dari komponen ini.
sumber
Cepat 3
sumber
Swift3 Menggunakan * XCode8
Apple menghapus
NS
dari nama kelas sehinggaNSDate
dapat ditukar keDate
. Anda mungkin mendapatkan peringatan kompiler jika Anda mencoba mentransmisikannya dengan mengatakan bahwa mereka akan selalu gagal, tetapi berfungsi dengan baik saat Anda menjalankannya di taman bermain.Saya mengganti
NSDate
model data inti yang saya hasilkan denganDate
dan mereka masih berfungsi.sumber
Di Swift 3 ke atas
Pemakaian:
sumber
Satu cara lagi untuk mendapatkan hasil:
sumber
Anda hilang
NSDayCalendarUnit
di komponen.sumber
Objective-C
sumber
Untuk cepat 4
sumber
Menurut saya, cara paling ringkas untuk melakukan ini di Swift adalah sebagai berikut:
sumber
Karena
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
ada fungsi bawaan di Foundation, yang dapat Anda gunakan di luar kotak. Tidak perlu mengimplementasikan fungsi sendiri.public func startOfDay(for date: Date) -> Date
Jadi Anda bisa menggunakannya dengan cara ini:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Perlu diingat, bahwa ini mempertimbangkan zona waktu perangkat. Anda dapat mengatur
.timeZone
tentangcalendar
jika Anda ingin memiliki misalnya UTC zona.Tautan ke halaman referensi Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
sumber
Hanya cara lain menggunakan
dateInterval(of:start:interval:for:)
dariCalendar
Saat kembali
startDate
berisi awal hari daninterval
jumlah detik dalam hari.sumber
Inilah yang saya gunakan untuk Swift 4.2:
Bekerja seperti pesona bagi saya. Anda dapat menambahkan ini ke ekstensi untuk tanggal mulai dan akhir pada
Date
, namun perlu diingat bahwa menambahkan ekstensi akan menambah waktu kompilasi (kecuali dalam file yang sama dengan kelas), jadi jika Anda hanya membutuhkannya di satu tempat atau di satu kelas. .. jangan gunakan ekstensi.sumber
sumber
Hanya untuk referensi, cara sederhana untuk mengatur Awal dan Akhir hari di Swift 4 ,
sumber
Unit kalender harus dianggap sebagai interval. Pada iOS 10
Calendar
memiliki beberapa metode bagus untuk iniAnda dapat menggunakan metode yang sama, untuk mendapatkan awal / akhir dari setiap komponen kalender (minggu / bulan / tahun dll)
sumber
day?.end
mengevaluasi ke 12:00 AM besok, bukan 11:59 malam ini.