2016-05-15 3 views
-2

У меня есть веб-сайт, работающий на IIS, который принимает две переменные времени, вычисляет эти переменные и производит разницу во времени в -Minutes (например, StartTime = "18:00", EndTime = "18: 30 ", Diff =" -30 ")Расчет разницы во времени Android и iOS

У меня это отлично работает в VBScript, используя функцию DateDiff(). Я искал высоко и низко, ища аналогичное решение для Android и iOS, поэтому я могу построить расчет времени в своем мобильном приложении и получить его в автономном режиме (если, например, нет подключения к интернету).

Это часть кода я использую в VBScript:

//Grab the values from the form controls 


    occtime = occDate.Value //from form controls 
    testTime = testDate.Value //from form controls 

    //work out the time difference in minutes. Should always a negative number. 
    timeCalc = DateDiff("n", testTime, occtime) 

Использование либо временной переменной, HH: MM или с использованием полной даты дд/мм/гггг HH: MM даст мне результат я но мне сложно работать в iOS (Swift) или Android Studio.

Спасибо заранее, за любую помощь.

+0

Я вы видели развитие своего сайта, вы тестируете алгоритмы? –

+0

Привет Алессандро. Вся цель - расчет содержания алкоголя в крови (BAC). Например, время простоя - это тот факт, что perosn был остановлен, Test Time - время, когда человек предоставил формальное испытание на дыхание, а результат Drager - это чтение BAC с устройства для дыхания. – Nick

+0

О, отлично! Я только что видел похожий сайт здесь: http://www.etilometro-online.it/, возможно, может быть полезно –

ответ

0

для IOS пожалуйста, попробуйте этот Swift код в XCode playgorund:

import Foundation 

let curerntDate = NSDate() 
let futureDate = NSDate(timeInterval: 36*60*60, sinceDate: curerntDate) 

let currentCalendar = NSCalendar.currentCalendar() 
let differenceDateComponents = currentCalendar.components([.Era, .Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: curerntDate, toDate: futureDate, options: NSCalendarOptions(rawValue: 0)) 
print(differenceDateComponents) 
+0

Спасибо, куча ребята. Я попробую и дам вам знать, как я пойду. Если вам нравится, вы можете увидеть сайт VBScript в действии: https://webbreath.azurewebsites.net – Nick

0

Swift 2.2 совместимое расширение:

extension NSDate { 
     func yearsFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Year, fromDate: date, toDate: self, options: []).year 
     } 
     func monthsFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Month, fromDate: date, toDate: self, options: []).month 
     } 
     func weeksFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.WeekOfYear, fromDate: date, toDate: self, options: []).weekOfYear 
     } 
     func daysFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Day, fromDate: date, toDate: self, options: []).day 
     } 
     func hoursFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Hour, fromDate: date, toDate: self, options: []).hour 
     } 
     func minutesFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Minute, fromDate: date, toDate: self, options: []).minute 
     } 
     func secondsFrom(date:NSDate) -> Int{ 
      return NSCalendar.currentCalendar().components(.Second, fromDate: date, toDate: self, options: []).second 
     } 
     func offsetFrom(date:NSDate) -> String { 
      if yearsFrom(date) > 0 { return "\(yearsFrom(date))y" } 
      if monthsFrom(date) > 0 { return "\(monthsFrom(date))M" } 
      if weeksFrom(date) > 0 { return "\(weeksFrom(date))w" } 
      if daysFrom(date) > 0 { return "\(daysFrom(date))d" } 
      if hoursFrom(date) > 0 { return "\(hoursFrom(date))h" } 
      if minutesFrom(date) > 0 { return "\(minutesFrom(date))m" } 
      if secondsFrom(date) > 0 { return "\(secondsFrom(date))s" } 
      return "" 
     } 
    } 

Для Android эти методы работают хорошо:

public static int calcDaysDiff(Date day1, Date day2) { 
     Date d1 = new Date(day1.getTime()); 
     Date d2 = new Date(day2.getTime()); 
     Calendar date1 = Calendar.getInstance(); 
     date1.setTime(d1); 
     Calendar dateCpy = (Calendar) date1.clone(); 
     Calendar date2 = Calendar.getInstance(); 
     date2.setTime(d2); 
     //checks if the start date is later then the end date - gives 0 if it is 
     if (date1.get(Calendar.YEAR) >= date2.get(Calendar.YEAR)) { 
     if (date1.get(Calendar.DAY_OF_YEAR) >= date2.get(Calendar.DAY_OF_YEAR)) { 
      return 0; 
     } 
     } 
     //checks if there is a daylight saving change between the two dates 
     boolean isDate1Summer = TimeZone.getDefault().inDaylightTime(d1); 
     boolean isDate2Summer = TimeZone.getDefault().inDaylightTime(d2); 
     int offset = 0; 
     //check if there as been a change in winter/summer time and adds/reduces an hour 
     if (isDate1Summer && !isDate2Summer) { 
      offset = 1; 
     } 
     if (!isDate1Summer && isDate2Summer) { 
      offset = -1; 
     } 
     return calcDaysDiffAux(dateCpy, date2) + checkFullDay(dateCpy, date2, offset); 
    } 

    // check if there is a 24 hour diff between the 2 dates including the daylight saving offset 
    public static int checkFullDay(Calendar day1, Calendar day2, int offset) { 
     if (day1.get(Calendar.HOUR_OF_DAY) <= day2.get(Calendar.HOUR_OF_DAY) + offset) { 
      return 0; 
     } 
     return -1; 
    } 

    // find the number of days between the 2 dates. check only the dates and not the hours 
    public static int calcDaysDiffAux(Calendar day1, Calendar day2) { 
     Calendar dayOne = (Calendar) day1.clone(), 
       dayTwo = (Calendar) day2.clone(); 

     if (dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR)) { 
      return Math.abs(dayOne.get(Calendar.DAY_OF_YEAR) - dayTwo.get(Calendar.DAY_OF_YEAR)); 
     } else { 
      if (dayTwo.get(Calendar.YEAR) > dayOne.get(Calendar.YEAR)) { 
       //swap them 
       Calendar temp = dayOne; 
       dayOne = dayTwo; 
       dayTwo = temp; 
      } 
      int extraDays = 0; 

      while (dayOne.get(Calendar.YEAR) > dayTwo.get(Calendar.YEAR)) { 
       dayOne.add(Calendar.YEAR, -1); 
       // getActualMaximum() important for leap years 
       extraDays += dayOne.getActualMaximum(Calendar.DAY_OF_YEAR); 
      } 
      return extraDays - dayTwo.get(Calendar.DAY_OF_YEAR) + dayOne.get(Calendar.DAY_OF_YEAR); 
     } 
    }