1

私はこの機能を持っています:

  function SecondsFormat(X)
   if X <= 0 then return "" end
   local t ={}
   local ndays = string.format("%02.f",math.floor(X / 86400))
   if tonumber(ndays) > 0 then table.insert(t,ndays.."d ") end
   local nHours = string.format("%02.f",math.floor((X/3600) -(ndays*24)))
   if tonumber(nHours) > 0 then table.insert(t,nHours.."h ") end
   local nMins = string.format("%02.f",math.floor((X/60) - (ndays * 1440) - (nHours*60)))
   if tonumber(nMins) > 0 then table.insert(t,nMins.."m ") end
   local nSecs = string.format("%02.f", math.fmod(X, 60));
   if tonumber(nSecs) > 0 then table.insert(t,nSecs.."s") end
   return table.concat(t)
  end

週と月を追加したいのですが、月の日が常に同じであるとは限らないという理由だけで、月の部分に頭を悩ませて週の部分に進むことができません。

2 番目の質問は、(グリッド内の) 最大 100 項目に対して関数が 3 秒ごとに呼び出されることを考えると、これを処理する最も効率的な方法は、結果を格納するためにテーブルを使用することですか?

編集:

  function ADownload.ETA(Size,Done,Tranrate) --all in bytes
   if Size == nil then return "--" end
   if Done == nil then return "--" end
   if Tranrate == nil then return "--" end
   local RemS = (Size - Done) / Tranrate
   local RemS = tonumber(RemS)
   if RemS <= 0 or RemS == nil or RemS > 63072000 then return "--" end
   local date = os.date("%c",RemS)
   if date == nil then return "--" end
   local month, day, year, hour, minute, second = date:match("(%d+)/(%d+)/(%d+) (%d+): (%d+):(%d+)")
   month = month - 1
   day = day - 1
   year = year - 70
   if tonumber(year) > 0 then
   return string.format("%dy %dm %dd %dh %dm %ds", year, month, day, hour, minute, second)
   elseif tonumber(month) > 0 then
    return string.format("%dm %dd %dh %dm %ds",month, day, hour, minute, second)
   elseif tonumber(day) > 0 then
    return string.format("%dd %dh %dm %ds",day, hour, minute, second)  
   elseif tonumber(hour) > 0 then
    return string.format("%dh %dm %ds",hour, minute, second)   
   elseif tonumber(minute) > 0 then
    return string.format("%dm %ds",minute, second)  
   else
    return string.format("%ds",second)  
   end      
  end

おそらくもっと速いだろうと思ったので、関数をメイン関数にマージしましたが、2つの質問があります。

1: 追加する必要がありました

  if date == nil then return "--" end

date:match で "nil" と比較しようとするとエラーが発生することがあるため、os.date は文字列またはテーブルとして nil を返すことについて文献に何も言及していないため、追加のコード行で問題が修正されますが、なぜそれが不思議なのか疑問に思っています以前のリターンですべての非イベントをキャッチしたと確信しているため、動作が発生しますか?

2: myfunction(...) のように記述された関数を時々見かけますが、それは単に引数を省略しているだけだと確信しています。そうであれば、最初の 3 つの「if」ステートメントを省略できる 1 行のコードはありますか?

4

2 に答える 2

3

os.date関数を使用して、使用可能な形式で日付値を取得できます。'*t'書式設定パラメーターは、返された日付を文字列ではなくテーブルにします。

local t = os.date('*t')
print(t.year, t.month, t.day, t.hour, t.min, t.sec)
print(t.wday, t.yday)

os.data はデフォルトで現在の時刻を使用します。必要に応じて明示的な時刻を渡すことができます (詳細については、os.data のドキュメントを参照してください)。

local t = os.date('*t', x)

テーブルのパフォーマンスに関しては、私はそれについて心配しません。関数がそれほど頻繁に呼び出されないだけでなく、テーブルの処理は、実行している可能性のある他のこと (os.date の呼び出し、多くの文字列フォーマットなど) よりもはるかに安価です。

于 2013-03-11T01:54:04.333 に答える
2

Lua のosライブラリに面倒な作業を任せてみませんか?

との違いを理解するためのより簡単な (読み: より良い) 方法がおそらくあり01/01/70ますが、それをどのように使用できるかについての簡単なアイデアを以下に示します。

function SecondsFormat(X)
    if X <= 0 then return "" end
    local date = os.date("%c", X) -- will give something like "01/03/70 03:40:00"
    local inPattern = "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)"
    local outPattern = "%dy %dm %dd %dh %dm %ds"
    local month, day, year, hour, minute, second = date:match(inPattern)
    month = month - 1
    day = day - 1
    year = year - 70
    return string.format(outPattern, year, month, day, hour, minute, second)
end

string.formatこれは、テーブルを作成して複数回呼び出すよりもはるかに高速であると思いますが、それをプロファイルする必要があります。

編集:"abc"連結する2つの関数を使用して、両方の方法"def"を使用して簡単なテストを実行しました。"ghi"これらの文字列をテーブルに挿入すると、連結に14秒かかり(もちろん数百万回の実行で)、単一のものを使用するとstring.format()6秒かかりました。これは、コードがとにかく(複数回)呼び出すことを考慮していませんstring.format()-また、除算による値の把握とパターンマッチングによる私との違いも考慮していません。パターン マッチングは確かに遅くなりますが、テーブルを持たないことによるメリットを上回るとは思えませんos.time()。おそらく最速の方法は、月と日を手動で計算してから、単一のstring.format(). しかし、繰り返しになりますが、それをプロファイリングする必要があります。

EDIT2 : missingnoには、"*t"オプション withos.dateを使用して最初に値を個別に提供するという良い点があります。繰り返しますが、これは、便宜上テーブルを使用するか、ストレージ用の文字列を使用するか、またはその他の理由によって異なります。"*t"と単一の組み合わせstring.format

function SecondsFormat(X)
    if X <= 0 then return "" end
    local date = os.date("*t", X) -- will give you a table
    local outPattern = "%dy %dm %dd %dh %dm %ds"
    date.month = date.month - 1
    date.day = date.day - 1
    date.year = date.year - 70
    return string.format(outPattern, date.year, date.month, date.day, date.hour, date.min, date.sec)
end
于 2013-03-11T01:45:30.607 に答える