【问题标题】:What data type should I use for reading year-month and year-week values ? c#我应该使用什么数据类型来读取年月和年周值? C#
【发布时间】:2013-11-19 17:25:38
【问题描述】:

技术是winforms,使用c#,数据库是SQlite。

我从数据库中获取值,将它们传输到列表中,然后用这些列表填充列表视图。

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

问题:

但在列表视图中,这些值显示为它们之间的斜线,即 2001 年 1 月写为 1/1/2001 12:00 am。 2002 年的第 31 周写成 3/1/2002 12:00 am。

我不希望输出中出现 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);
           }
       }

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

    对于您的YYMM 列,您可以像您一样使用DateTime。将其输出为字符串时,应使用yyyy-MM 格式。

    您的YYWW 列更复杂,因为DateTime 不支持解析周。我建议您创建自己的类型,并以 ISO standard 的方式显示它,例如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);
        }
    }
    

    【讨论】:

    • 我不确定我曾经使用过 .Dump()。奇怪,因为它也给了我以下错误:'System.Text.RegularExpressions.Match'不包含'Dump'的定义并且没有扩展方法'Dump'接受'System.Text.RegularExpressions.Match'类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)
    • @Newuser 哎呀,那是我不小心留下的东西。LINQPad 中的东西可以打印出您Dump() 的任何信息,而不会干扰执行。它有点像断点,用于调试/检查数据。
    • 哈哈没问题,但现在我得到YearWeek不包含int.tryparse的定义的错误
    • @Newuser 有什么问题?我在任何地方都没有int.tryparse。使用此处的代码,您将使用YearWeek.Parse。你可以修改它来创建一个YearWeek.TryParse,比如int.TryParse,如果无效数据是正常的(它不应该是,从数据库中出来 - 只是空值可能是正常的)。
    • @Newuser 我添加了一个TryParse 方法。
    【解决方案2】:

    您可以在DateTime.ToString(...) 方法中使用格式字符串。 使用这篇文章来编写您的格式字符串 http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx 。要从自定义日期时间字符串中获取 DateTime 结构,请使用 DateTime.ParseExact(...) 方法。

    例如年月格式字符串为"yyyy-MM"

    至于周数,情况稍微复杂一些。没有周数格式字符串,但您可以轻松地从日期获取它。请参阅此问题的答案: Week number of a year in dateformat它有你需要的一切。

    【讨论】:

      【解决方案3】:

      您可以在DateTime 类型上使用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();
      

      【讨论】:

        【解决方案4】:

        在查询中使用STRFTIME 函数。

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

        【讨论】:

          猜你喜欢
          • 2018-06-15
          • 1970-01-01
          • 2020-06-08
          • 2015-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-25
          • 1970-01-01
          相关资源
          最近更新 更多