2017-10-31 14 views
0

私は現在の時刻にタイムスタンプを更新する赤いボタンをクリックするアプリを作っています - >ボタンが緑色に変わります>タイムスタンプの12時間後にもう一度赤色になり、>サイクルが続行されます。ここに私のコードです:タイムスタンプを作成する場所と、ユーザーがアプリケーションを閉じて再オープンした後に参照する方法

var timestampHour = 8 
var timestampDay = 30 

func getCurrentTime() { 

     let user = FIRAuth.auth()?.currentUser?.uid 

     var timeToFirebase = 0 
     var timeToDayEnd = 0 

     let currentHour = Calendar.current.component(.hour, from: Date()) 
     let currentDay = Calendar.current.component(.day, from: Date()) 
     //self.nameLabel.text = String(currentHour) + " " + String(currentHour) 


     if (currentDay - timestampDay >= 2) { 

      self.ref?.child("users").child(user!).child("timeToWatch").setValue(0) 
      self.ref?.child("users").child(user!).child("streakStatus").setValue("n") 

     } 

     else if (abs(currentDay - timestampDay) == 1) { 

      timeToDayEnd = 24 - timestampHour 
      timeToFirebase = timeToDayEnd + currentHour 

      if (timeToFirebase >= 12) { 

       self.ref?.child("users").child(user!).child("timeToWatch").setValue(0) 
       self.ref?.child("users").child(user!).child("streakStatus").setValue("n") 

      } 

      else { 

       self.ref?.child("users").child(user!).child("timeToWatch").setValue(timeToFirebase) 

      } 


     } 

     else { 

      timeToFirebase = currentHour - timestampHour 
      if (timeToFirebase >= 12) { 

       self.ref?.child("users").child(user!).child("timeToWatch").setValue(0) 
       self.ref?.child("users").child(user!).child("streakStatus").setValue("n") 

      } 

      else { 

       self.ref?.child("users").child(user!).child("timeToWatch").setValue(timeToFirebase) 

      } 

     } 

    } 

私は1つの時間と別の時間の違いを見つける方法を見つけ出し、それに応じて行動することができました。しかし、ユーザーが最初にアプリケーションを開いたときにタイムスタンプを作成し、ユーザーがタイムスタンプの12時間後に現在のタイムスタンプにアプリを開くと、そのタイムスタンプを更新するにはどうすればよいですか?私はタイムスタンプを作る方法について全面的に混乱しています。

+0

質問に無関係ですが、コードに潜在的なバグがあります。 currentHourとcurrentDayを取得する2つの行は、 'Date()'への2つの別々の呼び出しを使用します。つまり、ある日付からその日までの時間を別の日付から取得します。真夜中にそのコードが呼び出されると、その時間と間違った(次の)日に23を得ることができる非常に小さなチャンスがあります。共通の 'Date'インスタンスを使用するか、2回の別々の呼び出しの代わりに1回の呼び出しで両方のコンポーネントを取得します。 – rmaddy

答えて

0

は、UNIXの時刻形式でタイムスタンプを必要とする場合は、このコードを使用することができます:

let currentDate = Date() 
let timeStamp = currentDate.timeIntervalSince1970 //returns something like 1509411424.038336 

あなたは、12時間は、使用することができます保存した後渡されたかどうかを確認しますし、いくつかの日付を格納し、かつますいくつかのロジックが必要な場合このコード:

func storeDate(_ date: Date) { 
     UserDefaults.standard.set(date.timeIntervalSince1970, forKey: "storedDate") 
    } 

    func getStoredDate() -> Date? { 
     if let timeStamp = UserDefaults.standard.value(forKey: "storedDate") as? Double { 
      return Date(timeIntervalSince1970: timeStamp) 
     } 
     return nil 
    } 

    func checkCurrentDate()-> Bool { 
     if let storedDate = getStoredDate() { 
      let nextDate = Date(timeInterval: 60 * 60 * 12, since: storedDate) 
      if nextDate < Date() { 
       return true 
      } else { 
       return false 
      } 
     } else { 
      storeDate(Date()) 
      return true 
     } 
    } 

あなたはこのコードを使用することができる2つの日付間の時間差を見つける必要がある場合:

let aDate = Date(timeIntervalSinceReferenceDate: 0) 
let bDate = Date(timeIntervalSinceReferenceDate: 60 * 60 * 12) 

let hoursDiff = Calendar.current.dateComponents([.hour], from: aDate, to: bDate).hour ?? 0 
+0

私はちょうど時間と日が必要です、上記のコードはどこですか?^ – DannyV

+0

@DannyV、日付コンポーネントのマッチング(aDay - bDay、aHour - bHour)は本当に悪い習慣です。 2つの完全な日付に一致する必要があります。たとえば、最初の日付は2017-01-02 15:00で、2番目の日付は2017-02-01 14:00です。あなたのロジックをやったところで、最初の日付> 2番目の日付を取得します...しかしこれは間違っています。 – Dmitry

+0

私は、これらの2つの日付の違いを時間内にどの程度正確に調べることができますか? – DannyV

関連する問題