簡體   English   中英

我應該使用哪種數據類型來讀取年月和年周值? C#

[英]What data type should I use for reading year-month and year-week values ? c#

技術是winforms,使用c#,數據庫是SQlite。

我從數據庫中獲取值,將其傳輸到列表中,然后使用這些列表填充listview。

我有兩列日期。 一個具有年和月(YYYY-MM)格式的值,另一個是年和周(YYYY-WW)的值。

問題:

但是在列表視圖中,這些值之間以斜杠顯示,即2001年1月寫為1/1/2001 12:00 am。 2002年第31周寫為2002年3月1日上午12:00。

我不想在輸出中使用TIME或斜杠。 (前2個列表是listview的輸出,上面有我提到的錯誤。后2個列是數據的外觀)。

在此處輸入圖片說明

是什么引起的問題 :我使用DateTime數據類型存儲這些列中的值。 是否有任何數據類型將僅以年-月和年-周格式輸出這些值,而不顯示斜線和時間。 如果我嘗試使用int,這些列甚至都不會被讀取,因此不能使用它。

代碼:(僅關注yyyymm部分)

 string sql6 = "select YYMM, TotalTrans  from t2 where cast(TotalTrans as int) < 1000";
       SQLiteCommand command3 = new SQLiteCommand(sql6, sqlite_conn);


       SQLiteDataReader reader3 = command3.ExecuteReader();

       while (reader3.Read())
       {

           int TotalTrans;
           DateTime yyyymm;  //Right here:

           if (DateTime.TryParse(reader3["YYMM"].ToString(), out yyyymm) && int.TryParse(reader3["TotalTrans"].ToString(), out TotalTrans))
           {
               YYMM.Add(yyyymm);
               TotalTransIrregularities.Add(TotalTrans);
           }
       }

對於YYMM列,您可以像YYMM一樣使用DateTime 以字符串形式輸出時,應使用yyyy-MM格式。

您的YYWW列更為復雜,因為DateTime不支持解析周。 我建議您創建自己的類型,並以ISO標准的方式顯示它,例如2002-W31 該類型可能如下所示:

public struct YearWeek
{
    private static readonly Regex parseRegex =
                            new Regex(@"^(?<year>\d{4})-W?(?<week>\d{2})$");
    public int Year { get; private set; }
    public int Week { get; private set; }
    public YearWeek(int year, int week) : this()
    {
        this.Year = year;
        this.Week = week;
    }
    public static bool TryParse(string s, out YearWeek result)
    {
        var match = parseRegex.Match(s);
        if (match.Success)
        {
            result = new YearWeek(int.Parse(match.Groups["year"].Value),
                                int.Parse(match.Groups["week"].Value));
            return true;
        }
        else
        {
            result = default(YearWeek);
            return false;
        }
    }
    public static YearWeek Parse(string s)
    {
        YearWeek result;
        if (TryParse(s, out result))
            return result;
        else
            throw new ArgumentException("s");
    }
    public override string ToString()
    {
        return string.Format("{0:0000}-W{1:00}", Year, Week);
    }
}

您可以在DateTime Types上使用ToString()函數來獲取所需的字符串格式。

例:

DateTime dt=DateTime.Now;
dt.ToString("yyyy"); => gives you year => 2013
dt.ToString("MM");=>gives you month=>11
dt.ToString("dd");=>gives you Date=>19

解決方案1:yyyy-MM格式獲取Date

String yearmonth=yyyymm.ToString("yyyy-MM");

解決方案2:yyyy-WW格式獲取Date

為了獲得WeekNumber您需要使用Calendar 您可以在Calendar對象上調用GetWeekOfYear()方法來獲取當前Week Number

using System.Globalization;
Calendar myCal = CultureInfo.InvariantCulture.Calendar;
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
String yearweek = yyyymm.ToString("yyyy") +"-"+ myCal.GetWeekOfYear(yyyymm, dfi.CalendarWeekRule, dfi.FirstDayOfWeek).ToString();

您可以在DateTime.ToString(...)方法中使用格式字符串。 使用本文撰寫您的格式字符串http://msdn.microsoft.com/zh-cn/library/8kb3ddd4(v=vs.110).aspx 要從自定義日期時間字符串獲取DateTime結構,請使用DateTime.ParseExact(...)方法。

例如,年月格式字符串將為"yyyy-MM"

至於星期幾,情況就難多了。 沒有周數格式字符串,但是您可以輕松地從日期獲取它。 請參閱以下問題的答案: dateformat中一年的星期數它具有您需要的一切。

在查詢中使用STRFTIME函數。

sqlite> select strftime('%Y-%m', 'now');
2013-11
sqlite> select strftime('%Y-%W', 'now');
2013-46

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM