Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: DateTime Format? How to fix value when format string don't contains year

  1. #1
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Mặc định DateTime Format? How to fix value when format string don't contains year

    Tôi đang gặp vấn đề khi parse một string thành datetime.

    Khi cần parse một string theo một format nào đó chúng ta có thể dùng method DateTime.ParseExact.

    Tuy nhiên vấn đề với tôi xảy ra khi string format (cái này chỉ có lúc runtime) không xác định năm. Khi đó .Net sẽ sử dụng năm hiện tại để điền vào.
    (Nếu sử dụng DateTimeStyles.NoCurrentDateDefault thì khi string format ko xác định date nó sẽ sử dụng: 0001-01-01, tuy nhiên nếu trong string format xác định month hoặc day, nó sẽ vẫn sử dụng năm hiện tại).

    Nếu để như vậy, thì kết quả tính toán trong chương trình của tôi mỗi năm sẽ một khác.

    Không biết ai có giải pháp nào thì xin chỉ giúp.

    Visual C# Code:
    1. public static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    2. public override double GetDoubleValue(string s)
    3. {
    4.     // TODO: What happen when format don't contains date?            
    5.     DateTime d = DateTime.ParseExact(s, this.format, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.NoCurrentDateDefault );
    6.     return d.Subtract(Epoch).TotalMilliseconds;
    7. }

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    294

    Đọc một hồi mới phát hiện ra không biết bạn muốn kết quả thế nào ^^!
    Is the moon rising...

  3. #3
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Cái quan trọng nhất là fix value, nếu cùng một giá trị đầu vào thì bất cứ thời điểm nào chạy cũng phải trả ra kết quả như nhau. Default value không thực sự quan trọng, nhưng tốt nhất mốc là unix epoch: 1970-01-01T00:00:00.000

    ví dụ khi chạy đoạn code:
    Visual C# Code:
    1. DateTime dt = DateTime.ParseExact("08-17 20:00", "MM-dd HH:mm",
    2.     CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);
    3.  
    4. Console.WriteLine(dt.ToString("s"));

    Nếu chạy ở năm 2008 thì kết quả sẽ được là:
    Code:
    2008-08-17T20:00:00
    Nhưng nếu chạy ở năm 2009 thì kết quả lại là:
    Code:
    2009-08-17T20:00:00
    Đã được chỉnh sửa lần cuối bởi zxc : 25-08-2008 lúc 09:00 PM. Lý do: add example

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    294

    Vấn đề này xử lý đơn giản nhất là viết thêm 1 hàm parse time ^^!
    Ví dụ thế này
    Visual C# Code:
    1. public DateTime ToSpecificTime(String sDate,String sFormat)
    2. {
    3.       DateTime ReturnDate = new DateTime();
    4.       String sSpecificYear = "1970";
    5.       if(sFomat == "MM-dd HH:mm"){
    6.             String sNewDate = sSpecificYear + "-" + sDate;
    7.             ReturnDate = DateTime.ParseExact(sNewDate, "yyyy-MM-dd HH:mm",
    8.             CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);
    9.       }else{
    10.             ReturnDate = DateTime.ParseExact(sDate, sFormat,
    11.                 CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);
    12.       }
    13.       return ReturnDate;
    14. }

    Cheers!
    Is the moon rising...

  5. #5
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Có lẽ cũng chỉ có nước đó thật. Hơi cực vì custom format của DateTime không phải ít.

    Lúc đầu còn tính tìm cách viết 1 cái Calendar khác thường cho nó, nhưng xem vào code của .Net thấy nó code cứng sử dụng GregorianCalendar chứ không phải calendar từ DateTimeFormatInfo => hết sử dụng được cách Custom Calendar:
    Visual C# Code:
    1.         // Trich tu: bool System.DateTimeParse.CheckDefaultDateTime(ref DateTimeResult result, ref Calendar cal, DateTimeStyles styles)
    2.         DateTime dateTimeNow = GetDateTimeNow(ref result, ref styles);
    3.         if ((result.Month == -1) && (result.Day == -1))
    4.         {
    5.             if (result.Year == -1)
    6.             {
    7.                 if ((styles & DateTimeStyles.NoCurrentDateDefault) != DateTimeStyles.None)
    8.                 {
    9.                     cal = GregorianCalendar.GetDefaultInstance();
    10.                     result.Year = result.Month = result.Day = 1;
    11.                 }
    12.                 else
    13.                 {
    14.                     result.Year = cal.GetYear(dateTimeNow);
    15.                     result.Month = cal.GetMonth(dateTimeNow);
    16.                     result.Day = cal.GetDayOfMonth(dateTimeNow);
    17.                 }
    18.             }
    19.             else
    20.             {
    21.                 result.Month = 1;
    22.                 result.Day = 1;
    23.             }
    24.         }
    25.         else
    26.         {
    27.             if (result.Year == -1)
    28.             {
    29.                 result.Year = cal.GetYear(dateTimeNow);
    30.             }
    31.             if (result.Month == -1)
    32.             {
    33.                 result.Month = 1;
    34.             }
    35.             if (result.Day == -1)
    36.             {
    37.                 result.Day = 1;
    38.             }
    39.         }

Các đề tài tương tự

  1. Định dạng datetime trong DataList ASP.NET - string format có tác dụng gì?
    Gửi bởi coldheart trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 4
    Bài viết cuối: 22-04-2013, 10:58 AM
  2. Format Datetime như thế nào là phù hợp?
    Gửi bởi mr.tuannguyen19 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 05-06-2012, 03:20 PM
  3. Format string
    Gửi bởi phehuyet trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 10-08-2009, 10:13 AM
  4. Cần giúp 1 đoạn format string.
    Gửi bởi abetterday trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 21-03-2009, 12:55 PM
  5. String Format of C# in C++
    Gửi bởi vpdp_pc trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 24-08-2008, 09:56 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn