2016-10-07 15 views
-1

この質問は基本的に、コード内のモジュラ算術概念を表現し、モジュロ符号を使用することに関するものです。モジュール式算術を使ってtimespansを計算するには?

最近、私はSCCMインストールのためのポップアップを作成しました。これはユーザーにインストール時間を与えるはずです。クライアントリクエイメントは、インストールに残った時間を時計で表示することでした。よく)。 24時間経過した時刻は24時間、残り時間は午後4時となります。

プログラムは13:00に実行され、時計は24 +3 = 27時間表示されます。

13:午前22時、それは42時間

ある24 + 18でなければならない場合、それは48時間

である24 + 24であるべきである16:00今私はそれに気づい

+ 27 = 40

16 + 24 = 40

22 + 18 =

40モジュロ24 =私は、私は差が残される40から現在時刻を減算するのであれば、基本的に

16 40:

40から13 = 27

40から16 = 24

40から22 = 18

だから何私がやったことはこれです:

//I need to make a timespan object which has 24 hours from current time + time left to the next 4pm 

//The context is time to install, which user should see 
Timespan TimeToInstall = new Timespan(23,59,59) 

DateTime Now = DateTime.Now; 
if (Now.Hour < 16) 
{ 
    long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks); 
    TimeToInstall = TimeSpan.FromTicks(TimeTo4); 
} 
else 
{ 

long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks) + TimeGiven.Ticks; 
TimeToInstall = TimeSpan.FromTicks(TimeTo4); 

} 

私は午後4時前に倍の時間を減算するとき、私はする必要はありませんので、上記の解決策の問題は、私はそれを短くすることができることを知っているということです24時間を追加します。実行時間が午後4時以上であれば、24時間を追加する必要があります。私はどのようにラフなアイデアを持って、例えば数学/擬似コードでこれをリファクタリングする:

絶対(16-13)モジュロ24 = 3

絶対(16-16)モジュロ24 = 0(24)

絶対(16-22)モジュロ24 = 18

質問はこのコードをリファクタリングするためにC#コードでどのように行うのですか?好きな言語を使用してください。しかし、私はC#の例ではすばらしいと思います。ありがとうございました

+0

この@Prixは何かをするか疑問ですコードでは、コードレビューのための質問ではなく、私はちょうどそれを追加しました。 –

答えて

1

これはどうでしょうか?

public static int HoursUntilDueTime(DateTime time) 
{ 
    DateTime dueTime = (time + TimeSpan.FromHours(8)).Date + TimeSpan.FromHours(24 + 16); 
    return (int)(0.5 + (dueTime - time).TotalHours); 
} 

それとも、目標時間(日付部分は無視されます)に渡したい場合:

public static int HoursUntilDueTime(DateTime currentTime, DateTime targetTime) 
{ 
    DateTime dueTime = (currentTime + TimeSpan.FromHours(24 - targetTime.Hour)).Date + TimeSpan.FromHours(24 + targetTime.Hour); 
    return (int)(0.5 + (dueTime - currentTime).TotalHours); 
} 

テストコード:

var targetTime = new DateTime(2000, 1, 1, 16, 00, 00); 
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 13, 00, 00), targetTime)); 
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 16, 00, 00), targetTime)); 
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 22, 00, 00), targetTime)); 
関連する問題