C#中日期型数据和长整型数据之间的转换,以及格式字串转换

来源:互联网 发布:数据报和虚电路 编辑:程序博客网 时间:2024/05/01 13:25
  

日期型数据和长整型数据之间的转换
    为什么要将日期型数据转换为长整型数据呢?或则长整数转成DateTime呢,也许原因很多,但就我个人来讲,Excel文件中日期cell的Value读取和转化.
    由于Excel中DateTime 单元读取的Value值是个Double, 在应用中需要转换成字串显示,如果读取text,在解析,那是太郁闷的事了,.........呵呵,还好现在可以解决这个问题了。
     日期型数据,在 C# 中的参与运算的时候,应该也是转换为长整型数据来运算的。它的长整型值是自 0001 年 1 月 1 日午夜 12:00,以来所经过时间以 100 毫微秒为间隔表示时的数字。这个数在 C# 的 DateTime 中被称为Ticks(刻度)。DateTime 类型有一个名为 Ticks 的长整型只读属性,就保存着这个值。
     如此,要从一个 DataTime 型数据得到 long 型值就非常简单了,只需要读出 DataTime 对象的 Ticks 值即可,如:
                    long longDate = DateTime.Now.Ticks;
 DateTime 的构造函数中也提供了相应的,从长整型数据构造 DateTime  型数据的函数:DateTime(long)。如:
                    DateTime theDate = new DateTime(longDate);
但这样对于读Excel日期cell的Value的 程序员来说,是给他们出了一道难题,因为日期型数据内部是以 Double 型表示的,将其转换为长整型后得到的仅仅是日期,而没有时间。如何协调这两种日期类型呢?
 System.DateTime 提供了 double ToOADate() 和 static DateTime  FromOADate(double) 两个函数来解决这个问题。
 前者将当前对象按原来的 double 值输出,后者则从一个 double 值获得一个 System.DateTime 对象。举例如下:
private void TestDateTimeLong() {
    double doubleDate = DateTime.Now.ToOADate();
    DateTime theDate = DateTime.FromOADate(doubleDate);
    this.textBox1.Text = "";
    this.textBox1.AppendText("Double value of now: " + doubleDate.ToString() + "\n");
    this.textBox1.AppendText("DateTime from double value: " + theDate.ToString() + "\n");
}  运行结果:
                    Double value of now: 37494.661541713
                    DateTime from double value: 2002-8-26 15:52:37

 格式化日期型数据
      编程的过程中,通常需要将日期型数据按照一定的格式输出,当然,输出结果肯定是字符串。为此,我们需要使用
                  System.DateTime 类的 ToString() 方法,并为其指定格式字符串。
                    MSDN 中,System.Globalization.DateTimeFormatInfo 
     类的概述里对模式字符串有非常详细的说明,因此,这里我只对常用的一些格式进行说明,首先请看下表:
                          d月中的某一天一位数的日期没有前导零
                          dd月中的某一天一位数的日期有一个前导零
                          ddd周中某天的缩写名称在 AbbreviatedDayNames 中定义
                          dddd周中某天的完整名称在 DayNames 中定义
                          M月份数字一位数的月份没有前导零
                          MM月份数字一位数的月份有一个前导零
                          MMM月份的缩写名称在 AbbreviatedMonthNames 中定义
                          MMMM月份的完整名称在 MonthNames 中定义
                          y不包含纪元的年份如果不包含纪元的年份小于 10,则显示不具有前导零的年份
                          yy不包含纪元的年份如果不包含纪元的年份小于 10,则显示具有前导零的年份
                          yyyy包括纪元的四位数的年份
                          h12 小时制的小时一位数的小时数没有前导零
                          hh12 小时制的小时一位数的小时数有前导零
                          H24 小时制的小时一位数的小时数没有前导零
                          HH24 小时制的小时一位数的小时数有前导零
                          m分钟一位数的分钟数没有前导零
                          mm分钟一位数的分钟数有一个前导零
                          s秒一位数的秒数没有前导零
                          ss秒一位数的秒数有一个前导零

                   
                    这时候,又出现一个问题,如果要输出的文本信息中包含格式字符怎么办?如
                    format = "year: yyyy, month: MM, day: dd";
                    this.textBox1.AppendText(now.ToString(format) + "\n");
                    将输出:
                    2ear: 2002, 4on下5: 08, 26a2: 26
                    这并不是我想要的结果,怎么办呢?有办法——
                    format = "\'year\': yyyy, \'month\': MM, \'day\': dd";
                    this.textBox1.AppendText(now.ToString(format) + "\n");
                    看,这次运行结果对了:
                    year: 2002, month: 08, day: 26
                    可以看出,只需要使用单引号或者双引号将文本信息括起来就好

原创粉丝点击