Использование 4 символов для обозначения времени будущей эпохи и сравнения с текущим днем

Я хотел бы попросить поделиться лучшими практиками или способами улучшения моего кода для моей очень конкретной проблемы, которую я решаю, которая включает в себя использование строки ограниченной длины из 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
                              }
                             }
                            }
                           }
                         }
                       }
                    }
                  }
              }
          }
      }
    

Как вы думаете, есть что улучшить или нет?

Почему бы не выполнить цикл indices, а затем включить внутри цикла переключатель для значений индекса, которые вам нужно обработать? Я думаю, с таким кодом будет намного проще справиться

Joakim Danielson 15.04.2024 07:51

@JoakimDanielson хорошая мысль, я знал, что нужны изменения, поэтому я сделаю это, спасибо

nore982 15.04.2024 07:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одна идея:

Проще всего было бы использовать 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 года.

Другие вопросы по теме