0

.NetのTimespanまたはDateTimeを使用しない、次のC#最適化バージョンは何ですか。NUnitはどのようにテストしますか?

TimeSpan ts = Date1 - Date2;
int numberOfDays = ts.Days;
4

3 に答える 3

0

日付をティックに変換し、減算してから、ティックを日数に戻すことができます。なぜTimeSpanを使用できないのですか?それはおそらくそれをしているでしょう。

このようなもの:

      DateTime a = DateTime.Now;
      DateTime b = a.AddDays(2);

      // ticks are in hns
      long ticks = b.Ticks - a.Ticks;
      long seconds = ticks / 10000000;
      long minutes = seconds / 60;
      long hours = minutes / 60;
      long days = hours / 24;

私は何日も「2」を取り戻します。

于 2008-12-03T14:48:30.493 に答える
0

Date1とDate2はどのタイプですか?たとえば、DateTimeのように見えます。DateTimeでない場合、Dateをどの変数に入れたいですか?いつでもDate1とDate2をStringに入れ、SubString()で遊んで年、月、日を取得できますが、それを操作するのは非常に面倒です。

次の問題を解決するための最適化された方法:

TimeSpan ts = Date1 - Date2;
int numberOfDays = ts.Days;

DateTime Date1 = new DateTime(2008,12,01);
DateTime Date2 = new DateTime(2008,12,25);
int numberOfDayBetweenDateThatShouldBe = 25;
Assert.IsTrue((Date2-Date1).TotalDays == numberOfDayBetweenDateThatShouldBe);
于 2008-12-03T14:53:17.237 に答える
0

ありがとう、これは宿題です(asp.net)

タスクは、ユーザーからの入力として 2 つの日付を受け取り、それらの間の日数を計算し、その数値をユーザーに表示する asp.net アプリケーションを c# で作成することです。これには、組み込みの .net フレームワークの DateTime または TimeSpan クラスを使用しないでください。

残念ながら、本番環境での私の最もエレガントな実装

private int CalculateDays(DateTime start, DateTime end )
{
   DateTime origin = new DateTime(); 
   return (end - origin).Days - (start - origin).Days;
}

protected void Button1_Click(object sender, EventArgs e)
{
    // Parse dates for correctness and range errors, warn as necessary
    DateTime start;
    DateTime end;

    // rough error implement error handling implementation   
    string errors = string.Empty;

         if(!DateTime.TryParse(txt_start_date.Text.Trim(), out start))   errors+="Start date was incorrect";
    else if(!DateTime.TryParse(txt_end_date.Text.Trim(), out end))   errors+= (errors.Length>0? errors+= "\n":"") + "End date was incorrect" ; 
    else if ((end.Day - start.Day) <= 0) errors+= (errors.Length>0? errors+= "\n":"" ) + "End date must be greater than the Start date" ;         //CultureInfo.InvariantCulture
    else 
    {
        Response.Write(CalculateDays(start, end)); 
    }
    Debug.Assert(errors.Length <= 0, errors); 
}

少なくとも DateTime.Days に触れずにこれを行う方法を確認できない理由があります。


編集 OK もう一度考え直して、少し猿の仕事をしますが、DateTime または Timespan はどこにも使用しません

public static class PrimitiveCal
{
    // incremental total days a normal year 
    private static int[] DaysInYr = new int[] {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };

    // incremental total days in a leap year 
    private static int[] DaysInLeapYr = new int[] { 0,31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };


    public static long GetDays(int[] dt_start, int[] dt_end)
    {

        int day_diff = dt_end[0] - dt_start[0];
        int s_mth = dt_start[1];
        int e_mth = dt_end[1];
        int s_year = dt_start[2];
        int e_year = dt_end[2];
        int yr_diff = e_year - s_year;

        return day_diff + (yr_diff > 0 ?
                         // use months as boundaries, cater for leap years
                         (YrType(e_year)[e_mth - 1] +
                         (YrType(s_year)[YrType(s_year).Length - 1] - YrType(s_year)[s_mth - 1])) +
                         (yr_diff == 1 ? 0 : AddMiddleYears(s_year, e_year))

                         // get month sums in same year 
                         : YrType(e_year)[e_mth - 1] - YrType(e_year)[s_mth - 1]);
    }

    private static int AddMiddleYears(int s_year, int e_year)
    {
        int total_days = 0;
        for (int i = s_year + 1; i <= e_year - 1; i++) total_days += YrType(i)[YrType(i).Length - 1];
        return total_days;
    }

    private static int[] YrType(int year)
    {
        return (year % 4  == 0 &&  year%100!=0) || year % 400 ==0 ? DaysInLeapYr : DaysInYr;
    }
}

于 2008-12-03T17:02:17.507 に答える