web-dev-qa-db-ja.com

Obj-cで秒を日、分、時間に変換する

Objective-Cでは、整数(秒を表す)を日、分、時間に変換するにはどうすればよいですか?

ありがとう!

22
higginbotham

この場合、単に除算する必要があります。

days = num_seconds / (60 * 60 * 24);
num_seconds -= days * (60 * 60 * 24);
hours = num_seconds / (60 * 60);
num_seconds -= hours * (60 * 60);
minutes = num_seconds / 60;

1983年1月19日午後3時から1000万秒以内の日数など、より洗練された日付計算では、NSDateComponentsと共にNSCalendarクラスを使用します。 Appleの日付と時刻のプログラミングガイドが役立ちます。

42
fish

これを試して、

int forHours = seconds / 3600, 
remainder = seconds % 3600, 
forMinutes = remainder / 60, 
forSeconds = remainder % 60;

同じ手順で、日、週、月、年などの詳細を取得できます

35
Amr Faisal

これは古い投稿ですが、とにかく共有したいと思います。次のコードは私が使用するものです。

int seconds = (totalSeconds % 60);
int minutes = (totalSeconds % 3600) / 60;
int hours = (totalSeconds % 86400) / 3600;
int days = (totalSeconds % (86400 * 30)) / 86400;

最初の行-分単位の秒数で割ると、残りの秒が得られます。

2行目-1時間の秒数で除算した後の秒の残りを取得します。次に、それを1秒の秒数で割ります。

3行目-1日の秒数で割った残りの秒数を取得します。次に、それを1時間の秒数で割ります。

4行目-1か月の秒数で割った秒の残りを取得します。次に、それを1日の秒数で割ります。 Daysには以下を使用できます...

int days = totalSeconds / 86400;

しかし、上記の行を使用して継続して数か月を取得したい場合、1か月だけを取得したい場合、1か月と30日になります。

XcodeでPlaygroundを開いて試してみます。

9
Sean Marraffa

ドキュメントのAppleで推奨されているように、objective-cで最も好ましい方法はこれです。

  NSDate *startDate = [NSDate date];
    NSDate *endDate = [NSDate dateWithTimeInterval:(365*24*60*60*3+24*60*60*129) sinceDate:startDate];

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];

    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *components = [gregorian components:unitFlags
                                                fromDate:startDate
                                                  toDate:endDate options:0];
    NSInteger years = [components year];
    NSInteger months = [components month];
    NSInteger days = [components day]; 
    NSLog(@"years = %ld months = %ld days = %ld",years,months,days);

UnitFlagsで定義されていないコンポーネントを取得しないようにしてください。整数は「未定義」になります。

6
JeanNicolas

組み込み関数strftime()を使用します。

static char timestr[80];
char * HHMMSS ( time_t secs )
{
    struct tm ts;
    ts = *localtime(&secs);
    strftime(timestr, sizeof(timestr), "%a %b %d %H:%M:%S %Y %Z", &ts); // "Mon May 1, 2012 hh:mm:ss zzz"
    return timestr;
}
3
Craig Detrick

32ビットと64ビットの両方に対応するためのちょっとした変更。 NSIntegerを使用すると、システムは自動的に32/64ビットに基づいてintまたはlongに変換されます。

NSInteger seconds = 10000;
NSInteger remainder = seconds % 3600;
NSInteger hours = seconds / 3600;
NSInteger minutes = remainder / 60;
NSInteger forSeconds = remainder % 60;

同じ方法で、日、週、月、年に変換できます

3
Tai Le Anh

これは、秒を秒、分、時間に変換するための私のアルゴリズムです(合計秒数とそれぞれの関係のみを使用)。

int S = totalSeconds % BaseSMH

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2) / BaseSMH

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2)) / BaseSMH ^ 2

そして、これが私の説明の後に続きます:

秒に変換されたテスト時間:HH:MM:SS = 02:20:10 => totalSeconds = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

秒->分と分->時間の間の基準は60です(秒->時間から60 ^ 2 = 3600)。

int totalSeconds = 8410
const int BaseSMH = 60

各単位(ここでは変数で表されます)は、秒の合計量から前の単位(秒で表されます)を削除し、秒と計算しようとしている単位との関係で除算することで計算できます。これは、このアルゴリズムを使用した各計算の様子です。

int S = totalSeconds % BaseSMH

int M = ((totalSeconds - S) % BaseSMH ^ 2) / BaseSMH

int H = (totalSeconds - S - M * BaseSMH) / BaseSMH ^ 2

すべての数学と同様に、分と時間の計算の各単位を前の単位の計算方法で置き換えることができます。各計算は次のようになります(M計算でBaseSMHで除算し、H計算でBaseSMHを乗算するとキャンセルされることに注意してください)お互いアウト):

int S = totalSeconds % BaseSMH

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2) / BaseSMH

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2)) / BaseSMH ^ 2

上記の「totalSeconds」と「BaseSMH」を使用したテストは、次のようになります。

int S = 8410 % 60

int M = ((8410 - 8410 % 60) % 60 ^ 2) / 60

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60 ^ 2)) / 60 ^ 2

Sの計算:

int S = 8410 % 60 = 10

Mの計算:

int M = ((8410 - 8410 % 60) % 60 ^ 2) / 60 
= ((8410 - 10) % 3600) / 60 
= (8400 % 3600) / 60 
= 1200 / 60 
= 20

Hの計算:

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60 ^ 2)) / 60 ^ 2 
= (8410 - 10 - ((8410 - 10) % 3600)) / 3600
= (8400 - (8400 % 3600)) / 3600
= (8400 - 1200) / 3600
= 7200 / 3600
= 2

これにより、必要な単位を追加できます。秒と必要な単位の関係を計算するだけです。各ステップの説明を理解していただければ幸いです。そうでない場合は、質問してください。詳しく説明します。

1

合計秒(self.secondsLeft)から日、時間、分、秒を取得します

days = self.secondsLeft/86400;
hours = (self.secondsLeft %86400)/3600;
minutes = (self.secondsLeft % 3600) / 60;
seconds = (self.secondsLeft %3600) % 60;

コード......

  [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES];

-(void) updateCountdown {

    int days,hours,minutes,seconds;
    self.secondsLeft--;

    days = self.secondsLeft/86400;
    hours = (self.secondsLeft %86400)/3600;
    minutes = (self.secondsLeft % 3600) / 60;
    seconds = (self.secondsLeft %3600) % 60;

    NSLog(@"Time Remaining =%@",[NSString stringWithFormat:@"%02d:%02d:%02d:%02d",days, hours, minutes,seconds]);
}
0
Deepak Nair

最初に魚の答えに似た解決策を考え出しました:

_const secondsToString = s => {
  const secondsOfYear = 60 * 60 * 24 * 365;
  const secondsOfDay = 60 * 60 * 24;
  const secondsOfHour = 60 * 60;
  const secondsOfMinute = 60;

  let y = ~~(s / secondsOfYear);    s %= secondsOfYear;
  let d = ~~(s / secondsOfDay);     s %= secondsOfDay;
  let h = ~~(s / secondsOfHour);    s %= secondsOfHour;
  let m = ~~(s / secondsOfMinute);  s %= secondsOfMinute;

  y = (y > 0 ? (y + 'y ') : '');
  d = (d > 0 ? (d + 'd ') : '');
  h = (h > 0 ? (h + 'h ') : '');
  m = (m > 0 ? (m + 'm ') : '');
  s = (s > 0 ? (s + 's ') : '');

  return y + d + h + m + s;
}_

配列map()およびreduce()関数を使用すると、反復と再帰が含まれるため、一般化できることに気付きました。

_const intervalToLevels = (interval, levels) => {
  const cbFun = (d, c) => {
    let bb = d[1] % c[0],
      aa = (d[1] - bb) / c[0];
    aa = aa > 0 ? aa + c[1] : '';

    return [d[0] + aa, bb];
  };

  let rslt = levels.scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c))
    .map((d, i) => ([d, levels.units[i]]))
    .reduce(cbFun, ['', interval]);
  return rslt[0];
};

const TimeLevels = {
  scale: [365, 24, 60, 60, 1],
  units: ['y ', 'd ', 'h ', 'm ', 's ']
};
const secondsToString = interval => intervalToLevels(interval, TimeLevels);_

関数intervalToLevels()を、液体の質量や長さなどの他の測定レベルに簡単に拡張できます。

_const LengthLevels = {
  scale: [1760, 3, 12, 1],
  units: ['mi ', 'yd ', 'ft ', 'in ']
};
const inchesToString = interval => intervalToLevels(interval, LengthLevels);

const LiquidsLevels = {
  scale: [4, 2, 2, 8, 1],
  units: ['gal ', 'qt ', 'pt ', 'cup ', 'fl_oz ']
};
const ouncesToString = interval => intervalToLevels(interval, LiquidsLevels);_
0
timothyzhang
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date dateObj1=null;
    Date dateObj2=null;
    try {
        // String format = "MM/dd/yyyy hh:mm:ss";
        dateObj1 = sdf.parse(Appconstant.One_One_time);
        dateObj2 = sdf.parse(Appconstant.One_Two_time);
        Log.e(TAG, "dateObj12" + dateObj1.toString() + "---" + dateObj2.toString());
        DecimalFormat crunchifyFormatter = new DecimalFormat("###,###");
        long diff = dateObj2.getTime() - dateObj1.getTime();
        /*int diffDays = (int) (diff / (24 * 60 * 60 * 1000));
        System.out.println("difference between days: " + diffDays);
        int diffhours = (int) (diff / (60 * 60 * 1000));
        System.out.println("difference between hours: "
                + crunchifyFormatter.format(diffhours));
        int diffmin = (int) (diff / (60 * 1000));
        System.out.println("difference between minutes: "
                + crunchifyFormatter.format(diffmin));*/
        int diffsec = (int) (diff / (1000));
        System.out.println("difference between seconds:"
                + crunchifyFormatter.format(diffsec));
0
Vela