在项目开发中,经常会碰到日期处理。比如查询中,可能会经常遇到按时间段查询,有时会默认取出一个月的数据。当我们提交数据时,会需要记录当前日期,等等。下面就看看一些常用的方法。

首先,DateTime是一个struct。很多时候,会把它当成一个类。但它真的不是,MSDN上的描述如下:

DateTime结构:表示时间上的一刻,通常以日期和当天的时间表示。语法:

[SerializableAttribute]
public struct DateTime : IComparable, IFormattable,
IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>

MSDN连接:MSDN DateTime结构

一、DateTime.Now属性

实例化一个DateTime对象,可以将指定的数字作为年月日得到一个DateTime对象。而DateTime.Now属性则可获得当前时间。如果你想按年、月、日分别统计数据,也可用DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day获取。同理,当前的时分秒也可以这样的方式获取。还可以在当前时间加上一个段时间等操作。

        static void Main(string[] args)
{
DateTime newChina = new DateTime(, , );
Console.WriteLine(newChina);
Console.WriteLine("当前时间:");
Console.WriteLine("{0}年,{1}月,{2}日",DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
Console.WriteLine("{0}时,{1}分, {2}秒",DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
Console.WriteLine("三天后:{0}",DateTime.Now.AddDays());
Console.ReadLine();
}

结果:

二、ToString方法

DateTime的ToString方法有四种重载方式。其中一个重载方式允许传入String,这就意味着你可以将当前DateTime对象转换成等效的字符串形式。比如我们将当前时间输出,日期按yyyy-mm-dd格式,时间按hh:mm:ss格式。

   Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
Console.WriteLine(DateTime.Now.ToString("hh:mm:ss"));

还有一个重载形式是需要提供IFormatProvider,使用指定的区域性特定格式信息将当前 DateTime 对象的值转换为它的等效字符串表示形式。

  static void Main(string[] args)
{
CultureInfo jaJP = new CultureInfo("ja-JP");
jaJP.DateTimeFormat.Calendar = new JapaneseCalendar();
DateTime date1 = new DateTime(, , );
DateTime date2 = new DateTime(, , ); try
{
Console.WriteLine(date2.ToString(jaJP));
Console.WriteLine(date1.ToString(jaJP));
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("{0:d} is earlier than {1:d} or later than {2:d}",
date1,
jaJP.DateTimeFormat.Calendar.MinSupportedDateTime,
jaJP.DateTimeFormat.Calendar.MaxSupportedDateTime);
}
Console.ReadLine();
}

结果:

没太明白,日本历史那么短?百度了一下1868年9月8日,明治维新以后了。

DateTimeFormatInfo类, 这里有比较全的时间日期格式对应的字符串。

三、DaysInMonth方法及IsLeapYear方法

DaysInMonth方法需要两个Int32型参数,返回指定年份指定月份的天数。关于月份的天数,多数只有2月需要特殊照顾一下。剩余的月份,无论哪一年的天数都是固定的。而二月呢,不但不是其他月份的30天或31天,她还分个闰年非闰年。

    static void Main(string[] args)
{
Console.WriteLine("2000年至2015年中二月的天数");
for (int i = ; i < ; i++)
{
Console.WriteLine("{0}年2月有:{1}天", i, DateTime.DaysInMonth(i, ));
}
Console.ReadLine();
}

输出结果:

从输出结果中可以看出,2月为29天的年份为闰年。但其实DateTime还提供了判断闰年的方法IsLeapYear,该方法只要一个Int32的参数,若输入的年份是闰年返回true,否则返回false。(.Net Framework就是这么贴心,你要的东西都给你封装好了,直接拿来用好了。)要是没这个方法呢,得自己去按照闰年的规则去写个小方法来判断。

 static void Main(string[] args)
{
Console.WriteLine("2000年至2015年中二月的天数");
for (int i = ; i < ; i++)
{
if (DateTime.IsLeapYear(i))
Console.WriteLine("{0}年是闰年,2月有{1}天", i, DateTime.DaysInMonth(i, ));
else
Console.WriteLine("{0}年是平年,2月有{1}天",i,DateTime.DaysInMonth(i,));
}
Console.ReadLine();
}

微软现在已经将.NetFramework开源了,这意味着可以自己去查看源代码了。附上DateTime.cs的源码链接,以及IsLeapYear方法的源代码。虽然仅仅两三行代码,但在实际开发中,你可能一时间想不起闰年的计算公式,或者拿捏不准。封装好的方法为你节省大量时间。

DateTime.cs源码中IsLeapYear方法

      // Checks whether a given year is a leap year. This method returns true if
// year is a leap year, or false if not.
//
public static bool IsLeapYear(int year) {
if (year < || year > ) {
throw new ArgumentOutOfRangeException("year", Environment.GetResourceString("ArgumentOutOfRange_Year"));
}
Contract.EndContractBlock();
return year % == && (year % != || year % == );
}

 总结

介绍了几个算是比较常用的方法。在自己的项目中遇到日期操作的时候,多看看.NetFramework给我们提供了什么样的方法。很多时候用所提供的方法拼凑一下,就能轻易的获取到我们想要的日期或者时间。

C# DateTime结构的常用方法的更多相关文章

  1. C++ DateTime 结构

    OS:Win7 ,Tools:VS2015 DateTime.h #pragma once struct DateTime { public: unsigned Year; // years sinc ...

  2. time 与 datetime 模块的常用方法

    时间格式 一个名词: UTC(Coordinated Universal Time):格林威治天文时,世界标准时间.中国为东八区 UTC+8 在编程的世界中,一定要了解的几种时间格式: 1.时间戳 从 ...

  3. C# 计算时间差 用timespan函数

    TimeSpan 结构  表示一个时间间隔. 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 1.DateTime值类型代表了一个从公元0001年1月1日0点0分 ...

  4. winform timespan 两个时间的间隔(差) 分类: WinForm 2014-04-15 10:14 419人阅读 评论(0) 收藏

    TimeSpan 结构  表示一个时间间隔. 先举一个小例子:(计算两个日期相差的天数) 代码如下: DateTime dt = DateTime.Now.ToShortDateString(yyyy ...

  5. ASP.NET中TimeSpan的用法

    一.TimeSpan常量.字段 TimeSpan.MaxValue; // 10675199.02:48:05.4775807TimeSpan.MinValue; //-10675199.02:48: ...

  6. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  7. .NET DateTime类型变量作为参数时设置默认值

    一个小的 Tips. .NET 中函数参数的默认值需要是编译时常量.如果参数是引用类型,可以设置Null,如果是值类型,可以设置相应的编译时常量,如整型可以用整数,但对于DateTime(结构体,值类 ...

  8. 将不确定变为确定~DateTime.MinValue和MaxValue引发的异常

    回到目录 问题描述: SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间 概念相关 .Net中的DateTime结 ...

  9. 【C#】第3章学习要点(三)--常用类和结构的用法

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.DateTime结构和TimeSpan结构 DateT ...

随机推荐

  1. nyoj 228 士兵杀死(五岁以下儿童)【树状数组】

    分析:这个问题问的是,因为它是一个单独的更新.因此,让我们更新,然后在c[i]表现为1~i之间,还原之后看起来像一个. #include <cstdio> #include <cst ...

  2. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  3. Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程

    安装SDK 1.Hi3531 SDK包的位置     在"Hi3531_V100R001***/01.software/board"夹,你可以看到一个 Hi3531_SDK_Vx. ...

  4. yum 简介及使用 安装、删除

    使用yum装软件很方便,这里简单介绍一下. Yum简介 Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE.CentOS中的She ...

  5. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  6. EXCEL随机密码生成函数

    =CHAR(INT(RAND()*+))&INT(RAND()*+)&CHAR(INT(RAND()*+))&INT(RAND()*+)&CHAR(INT(RAND() ...

  7. Java equals的一个坑

    public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...

  8. Java没有源代码的同步集合~

    存档~~~~ Synchronized,volatile,lock 锁定->[就绪队列,阻塞队列] 第一个是jvm等级达到. 与volatile所不同的是,后者不能从工作存储器写回到主存储器. ...

  9. SSh框架结构(Struts2.1+Hibernate4.0+Spring3.1)

    一个.使用的工具 开发工具:My Eclipse 10.7以及对应的java开发工具 框架版本号:Struts2.1+Hibernate3+Spring3.0 数据库:MySql5.5 Mysql可视 ...

  10. Android源代码学习之六——ActivityManager框架解析

    ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...