Я хотел бы попросить поделиться лучшими практиками или способами улучшения моего кода для моей очень конкретной проблемы, которую я решаю, которая включает в себя использование строки ограниченной длины из 4 символов для представления будущей даты, которая может быть через неделю или месяц и т. д. И сравнение это до сегодняшнего дня, а затем что-то делать, если прошло слишком много дней.
Я думаю, что смогу сделать это, создав строку, которая всегда начинается с «17», вставив четыре цифры и дополнив остальное четырьмя нулями. Мне не нужно, чтобы это было очень точно в течение дня или около того.
Несколько вещей, на которые стоит обратить внимание:
Я знаю о возможности пользователя вручную изменить дату в настройках iPhone. Я планирую проверить дату сервера в будущем и сравнить во второй раз, но это в основном автономное приложение.
Строку из 4 символов, которую я получаю, я тот, кто введет эту строку в поле данных периферийного устройства Bluetooth. Строка сохраняет возможность быть буквами или не всеми числами в будущем, поэтому я сначала проверяю, все ли символы являются целыми числами, прежде чем превращать ее в дату.
Мой код, вероятно, не самый эффективный
Вероятно, это звучит как глупая проблема, но это те параметры, с которыми я работаю.
if let reservationDate = node?.user?.dateValue {
let arr = Array(reservationDate)
//I am checking whether the index exists probably unnecessary but being overly cautious
if arr.indices.contains(0) {
if let char1 = Int(String(arr[0])){
if arr.indices.contains(1) {
if let char2 = Int(String(arr[1])){
if arr.indices.contains(2) {
if let char3 = Int(String(arr[2])){
if arr.indices.contains(3) {
if let char4 = Int(String(arr[3])){
let deviceValue = char1 + char2 + char3 + char4
let fullEpochValue = "17" + String(deviceValue) + "0000"
if let fullEpochValueToInt = TimeInterval(fullEpochValue){
let savedDate = Date(timeIntervalSince1970: fullEpochValueToInt)
let now = Date()
let calendar = Calendar.current
let difference = calendar.numberOfDaysBetween(savedDate, and: now)
if difference > 2 {
//do something if greater than 2 days
}
}
}
}
}
}
}
}
}
}
}
Как вы думаете, есть что улучшить или нет?
@JoakimDanielson хорошая мысль, я знал, что нужны изменения, поэтому я сделаю это, спасибо





Одна идея:
Проще всего было бы использовать 4-значные шестнадцатеричные числа, что дало бы 65536 вариантов дней (179 лет). Преимущество шестнадцатеричных чисел состоит в том, что с ними легко работать и конвертировать.
Установите начальную дату, например «Эпоху» (1 января 1970 г.), и посчитайте дни, начиная с нее. Время Unix, основанное на «Эпохе», использует секунды с тех пор, но, поскольку в сутках 86400 секунд, дни легко вычислить, и наоборот.
import time
import datetime
# gives the 4 character string of the day
a=hex(int(time.time()/86400))[2:]
print(a) #19828 = 4D74h
# converting back
b=int(a,16)*86400
print(datetime.datetime.utcfromtimestamp(b).strftime("%Y-%m-%d")) #'2024-04-15'
Если этого временного диапазона недостаточно, вы можете использовать длинную строку из 4 символов для обозначения определенного дня, тогда у вас будет 26^4=456976 возможностей, если вы просто используете заглавные или строчные буквы. Если вы добавите числа, то получится 36^4=1679616 возможностей, а с верхними и нижними символами и числами - 62^4=14776336 возможностей (≈40000 лет). Однако преобразование строки в число более сложное, и его нужно делать самостоятельно.
Примечание. Временная метка Unix имеет проблему 2038 года.
Почему бы не выполнить цикл
indices, а затем включить внутри цикла переключатель для значений индекса, которые вам нужно обработать? Я думаю, с таким кодом будет намного проще справиться