Archive

Archive for the ‘ASP.net’ Category

.Net三层架构

July 8th, 2009 Tony hu No comments

三层体系结构的概念

.Net三层架构用户界面表示层(USL)

业务逻辑层(BLL)

数据访问层(DAL)

各层的作用

1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.

2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx, 如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

具体的区分方法

1:数据数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作。而不必管其他操作。

2:业务逻辑层:主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。

3:表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。

三层结构解释

所谓三层体系结构,是在客户端与数据库之间加入了一个中间层,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。 三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交换.

开发人员可以将应用的商业逻辑放在中间层应用服务器上,把应用的业务逻辑与用户界面分开。在保证客户端功能的前提下,为用户提供一个简洁的界面。这意味着如果需要修改应用程序代码,只需要对中间层应用服务器进行修改,而不用修改成千上万的客户端应用程序。从而使开发人员可以专注于应用系统核心业务逻辑的分析、设计和开发,简化了应用系统的开发、更新和升级工作。

那么为什么要应用“中间业务层”呢?举些例子:

我们假设有一段登录代码,则可以这样处理Web程序,外观层负责接收前台页面的数据,然后传给中间层,中间层对数据进行处理,比如格式化,防SQL注入等等一些,这样的数据再传给数据访问层然后与数据库进行操作,比如与数据库的用户名和密码匹配等等一些代码。

“中间业务层”的用途有很多,例如:验证用户输入数据、缓存从数据库中读取的数据等等……但是,“中间业务层”的实际目的是将“数据访问层”的最基础的存储逻辑组合起来,形成一种业务规则。例如:“在一个购物网站中有这样的一个规则:在该网站第一次购物的用户,系统为其自动注册”。这样的业务逻辑放在中间层最合适:

.Net三层架构

在“数据访问层”中,最好不要出现任何“业务逻辑”!也就是说,要保证“数据访问层”的中的函数功能的原子性!即最小性和不可再分。“数据访问层”只管负责存储或读取数据就可以了。

ASP.NET中的三层结构说明

完善的三层结构的要求是:修改表现层而不用修改逻辑层,修改逻辑层而不用修改数据层。否则你的应用是不是多层结构,或者说是层结构的划分和组织上是不是有问题就很难说.不同的应用有不同的理解,这只是一个概念的问题.

理解ASP.NET中的三层结构——为什么要分三层?

我们用三层结构主要是使项目结构更清楚,分工更明确,有利于后期的维护和升级。它未必会提升性能,因为当子程序模块未执行结束时,主程序模块只能处于等待状态。这说明将应用程序划分层次,会带来其执行速度上的一些损失。但从团队开发效率角度上来讲却可以感受到大不相同的效果。

需要说明一下,三层结构不是.NET的专利,也不是专门用在数据库上的技术。它是一种更加普适的架构设计理念。

个人感觉

个人感觉此种架构要在数据库设计上注意表之间的关系,尽力满足主与子的关系。在功能上对用户要有一定的限制,不要表现在对于子表的删除操作一定要慎重,以免造成主表与子表的数据在逻辑上出现的主表的外键在子表中没有相对应的值。

对于表的综合查询方法是:

先对主表查询,调用主表所对应的DL。再根据主表的记录分别对每一个子表进行查询。将自表的查询结果添加的主表后,形成一个大的查询集合。

对于表的操作(增删改):

此时只对主表进行操作,调用主表对应的DL中的操作方法。

RL层是逻辑判断层,主要是对页面上传入的数据进行逻辑判断。RL层之上就是UI

如何建立一个三层体系结构解决方案

新建一个空白解决方案。然后:

“添加”-“新建项目”-“其他项目”-“企业级模版项目”-“C#生成块”-“数据访问”(数据层,下简称D层)

“添加”-“新建项目”-“其他项目”-“企业级模版项目”-“C#生成块”-“业务规则”(业务层,下简称C层)

“添加”-“新建项目”-“其他项目”-“企业级模版项目”-“C#生成块”-“Web用户界面”(界面层,下简称U层)

右键点“解决方案”-“项目依赖项”,设置U依赖于D、C,C依赖于D。

对U添加引用D、C,对C添加引用D。

到此为止,一个三层的架子建立起来了。我上面说的很具体很“傻瓜”,知道的人觉得我废话,其实我这段时间很强烈的感觉到非常多的人其实对这个简单的过程完全不了解。虽然不反对建2个“空项目”和1个“Asp   net   Web应用程序项目”也可以作为3层的框架,而且相当多的人认为其实这些“企业级模板项目”其实就是个空项目,这是一个误区。没错,企业级模板项目你从解决方案资源管理器里看它是个什么也没有的,但是你可以用记事本打开项目文件,看见不同了吧??有些东西在背后,你是看不见的,不过系统已经做好了。也就是说,如果你在C层里的某个类里“using   System   Data   SqlClineit”,或者使用一个SqlConnection对象,编译时候不会出错,但是会在“任务列表”里生成一些“策略警告”,警告你在C层里不要放应该放在D层的东西(虽然就程序来说没错,但是可读性可维护性就打了折扣)而这种功能,空项目是无法給你的。

在新TraceLWord3中,应用了“企业级模板项目”。把原来的LWordTask.cs,并放置到一个单一的项目里,项目名称为:AccessTask。解决方案中又新建了一个名称为:InterService的项目,该项目中包含一个LWordService.cs程序文件,它便是“中间业务层”程序。为了不重复命名,TraceLWord3的网站被放置到了WebUI项目中。更完整的代码,可以在CodePackage/TraceLWord3目录中找到——

.Net三层架构

面象对象与实际的结合

我们知道建桥需要砖块,应该是先准备好砖再来建桥,不过为了讲解上的顺序性和连贯性,简单性。我们先建桥,建的过程中需要砖块再现做,这样就不会多出来“桥不需要的东西”。注意在实际中,还是应该先准备砖块。

U层其实就是桥,C层是砖块,D层是原料(石头、沙子)。这也解释前面为什么U层要引用、依赖D层(而不是U对C,C对D的层次),因为桥除了需要砖头,其实也需要石头沙子。

“三层结构”的缺点

有些网友在读完这篇文章前作之后,对我提出了一些质疑,这提醒我文章至此还没有提及“三层结构”的缺点。“三层结构”这个词眼似乎一直都很热门,究其原因,或许是这种开发模式应用的比较普遍。但是“三层结构”却并不是百试百灵的“万灵药”,它也存在着缺点。下面就来说说它的缺点……

“三层结构”开发模式的一个非常明显的缺点就是其执行速度不够快。当然这个“执行速度”是相对于非分层的应用程序来说的。从文中所给出的时序图来看,也明显的暴露了这一缺点。TraceLWord1和TraceLWord2没有分层,直接调用的ADO.NET所提供的类来获取数据。但是,TraceLWord6确要经过多次调用才能获取到数据。在子程序模块程序没有返回时,主程序模块只能处于等待状态。所以在执行速度上,留言板的版本越高,排名却越靠后。“三层结构”开发模式,不适用于对执行速度要求过于苛刻的系统,例如:在线订票,在线炒股等等……它比较擅长于商业规则容易变化的系统。

“三层结构”开发模式,入门难度够高,难于理解和学习。这是对于初学程序设计的人来说的。以这种模式开发出来的软件,代码量通常要稍稍多一些。这往往会令初学者淹没在茫茫的代码之中。望之生畏,对其产生反感,也是可以理解的……

其实,无论哪一种开发模式或方法,都是有利有弊的。不会存在一种“万用法”可以解决任何问题。所以“三层结构”这个词眼也不会是个例外!是否采用这个模式进行系统开发,要作出比较、权衡之后才可以。切忌滥用!

源文:http://tech.ddvip.com/2009-01/1232337018106332.html

Categories: ASP.net, Web Tags: , , ,

Gridview编辑状态下CheckBoxList和DropDownList数据绑定

July 3rd, 2009 Tony hu No comments

这两天老老大在泰国,我做的POP系统需要让我增加两个功能,其中就用到了在Gridview编辑状态下控件绑定数据库的问题,查询了相关资料后终于搞定了。将主要的代码写在这里,记录一下。

主要就是一个:
e.Row.RowState == DataControlRowState.Edit ||
            e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit
我觉得主要是用来判断Gridview的行的状态,之前没有加这个条件,所以一直是没有绑定到对象之类的错误提示。 

主要的代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //判断是否是DataRow,以防止鼠标经过Header也有效果
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //行的状态是: 编辑状态 或者 (交替行且是编辑状态)
        if (e.Row.RowState == DataControlRowState.Edit ||
            e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit)
            )
        {
            //下面是绑定CheckBoxList,根据Gridview中的显示的值,更改CheckBoxList的选中状态
            Label lab = (Label)e.Row.FindControl(“TxtPrinter”);
            CheckBoxList chk = (CheckBoxList)e.Row.FindControl(“OperatorList”);                   
            string txtPrinter = lab.Text;
            if (txtPrinter != “”)
            {
                for (int i = 0; i < chk.Items.Count; i++)
                {
                    if (txtPrinter.IndexOf(chk.Items[i].Text.ToString()) >= 0)
                    {
                        chk.Items[i].Selected = true;
                    }
                }
            }
            //下面是绑定DropDownList,根据Gridview Cells中显示的内容查找数据库,如果存在相关信息就显示DropDownList,并绑定
            DropDownList printroll = (DropDownList)e.Row.FindControl(“PrintRollList”);
            TextBox txt_printroll = ((TextBox)e.Row.FindControl(“txtPrintroll”));
            BLL.printroll bll = new BLL.printroll();
            string pid = bll.GetID(txt_printroll.Text.Trim());
            if (pid == “–”)
            {
                printroll.Visible = false;
            }
            else
            {
                DataTable dt = bll.GetChildList(Convert.ToInt32(pid));
                if (dt.Rows.Count != 0)
                {
                    printroll.DataSource = dt;
                    printroll.DataTextField = dt.Columns["printroll"].ToString();
                    printroll.DataValueField = dt.Columns["printroll"].ToString();
                    printroll.DataBind();

                    printroll.Items.Insert(0, “–PrintRoll–”);
                    printroll.Items[0].Value = “0″;
                    printroll.Visible = true;
                }
            }                   
        }
    }

}

Categories: ASP.net, Web Tags:

详解VisualStudio使用技巧二

June 11th, 2009 Tony hu 1 comment

怎样使用书签?
怎样使用即时窗口来显示变量或执行方法?
怎样在硬盘中快速找到项目中的文件?
怎样快速调整文档或某段代码的格式?
怎样快速把文件加入到项目中?
怎样强制调用智能提示?
怎样强制调用参数信息?
怎样跳转到指定的行?

怎样使用向前定位及向后定位快捷键?
怎样快速切换不用的页面?
怎样快速隐藏或显示当前代码段?
怎样同时修改多个控件的属性?
怎样录制与播放临时宏?

 

9.怎样使用书签来快速找到自己的文件?

     如果你在开发一个中、大型项目,如果你的解决方案下面包含很多工程,如果你拥有很多的页面,那么要想快速找到想要的某个页面是不是很麻烦,层层目录去找?太慢了,何况要还要让你去找某个页面中的某段代码呢?!

     VS中的书签功能能够很好地解决这一问题。首先把光标放到需要标记书签的代码处,然后点击VS中的插入书签按钮,就完成了设置书签的操作。也可以使用设置书签的快捷键:Ctrl+B,Ctrl+T来完成书签的设置或取消。

见图:

书签设置好之后,直接在书签列表中双击你设置的书签就能直接跳转到想要的代码段了。提醒一下,你可以自己重命名书签的名字呀,很方便吧。

10.怎样使用即时窗口来调试程序?

     这个即时窗口的用途就不用说了,大家可能都知道,但是好多人却因为不小心关掉了这个窗口而再想使用它时却怎么找也找不到。

     想一想,既然是即时窗口肯定是在调试的时候才有用,那么怎样打开它呢?调试——窗口——即时窗口,或快捷键:Ctrl+D,I

11.怎样在硬盘中快速找到项目中的文件?

     如果你在使用VS,想拷贝项目中的某个文件,不要再去硬盘中一个目录一个目录深入了,在VS中打开该文件,然后右键该选项-打开所在的文件夹即可,见图:

     

     

12.怎样快速调整文档或某段代码的格式?

     现在大家写代码都喜欢拷代码,可是拷过来的代码有时候毕竟不像写的那样格式很正确,排的很整齐,怎麽办?手动一行一行地调整?不用!

交给VS来做这无聊的工作吧:选择编辑——高级——设置文档的格式 或 编辑——高级——设置选中代码的格式。有了它再也不怕代码排版不美观了。

13.怎样快速把文件加入到项目中?

     打开VS,直接把文件粘贴到想要放置的文件夹中即可。

14.怎样强制调用智能提示?

     如果没有VS的只能提醒,估计好多人都不会写代码了。可是智能提醒又不是能够让我们随心所欲地使用,过了那个时候你鼠标再怎么移动它都不会出来,搞的我们有时候不得不把原来写的代码删除一部分重新点个”.”来调用智能提醒。

     其实VS中有个快捷键,能够真正让我们达到随心所欲,想什么时候看智能提醒就什么时候看。

     把光标放到想调用智能提醒的地方,然后输入Ctrl+J,看吧,熟悉的智能提醒又出来了。见图:

     

15.怎样强制调用参数信息?

     一个方法的参数信息也是很重要的,可是它有时候会使哦我们存在和14条中相同的困惑。怎样让我们“想看就看”呢?

     记住这个快捷键:Ctrl+Shif+空格,让你想看就看。 光标放到参数名上面,然后输入Ctrl+Shif+空格,看看什么出来了:

     

16.怎样跳转到指定的行?

     两种方法,能够快速定位到文档中的某一行:1.Ctrl+G  2.单击状态栏中的行号,如下图:

     

17.怎样使用向前定位及向后定位快捷键?

     相信VS中的“转到定义”大家都喜欢用,可是转到定义之后怎么能够快速地转回来呢?下面这个快捷键会节省你“转回来”的时间:

     Ctrl+_ 。如果你转回来之后还想转到定义,直接输入:Ctrl+Shif+_ 就好了。来回切换吧,想怎么看就怎么看。

     如果你说这样看着太累了,那再告诉你一个更简洁的方法:打开:视图——代码定义窗口,然后你再在页面中把鼠标点到某个方法上,看看代码定义窗口中显示的是什么:

     

18.怎样快速切换不用的页面?

     Window中切换不同的窗口的快捷键你知道吧:Alt+Tab,那么VS中也有:Ctrl+Tab,看看效果吧:

     

19.怎样快速隐藏或显示当前代码段?

     Ctrl+M,M
20.怎样同时修改多个控件的属性?

     选中多个控件,然后右键属性,这个时候这些控件共有的属性就会出现,修改之后所有的控件都会变化。
21.怎样录制与播放临时宏?

     如果你在VS中需要不断重复一系列键盘操作的时候,这个时候你可以考虑让VS自己写代码了。使用VS中的宏功能,把你的一系列需要不断重复的键盘操作给录制下来,然后直接执行宏就能让VS自己写代码了。

     录制:工具-宏-记录临时宏,Ctrl+Shif+R
     播放:工具-宏-运行临时宏,   Ctrl+Shif+P 
     保存:工具-宏-保存临时宏.,可以重命名宏

     

     后记:OK,这个系列写完了,对VisualStudio你更熟悉了吗?“工欲善其事,必先利其器”,让我们拿起VisualStudio这把利器,打造更美好的明天吧!That’s all.

来自:http://www.cnblogs.com/qqflying/archive/2008/11/24/1337489.html

Categories: ASP.net, Web Tags: , ,

详解VisualStudio使用技巧一

June 11th, 2009 Tony hu No comments

     VisualStudio虽然大家每天都在使用它,但是可能有些功能的使用大家并不清楚,甚至不知道有这项功能,下面这些技巧可能会对你有所帮助。

     先上目录:

     第一节:

     怎样给自己的代码添加版权信息。
     怎样给自己的代码添加代码段。
     怎样使用任务管理器。
     怎样使用发布网站功能。
     怎样把常用代码放到工具箱中的常规选项中。
     怎样怎样在多个窗口查看同一个文档。
     怎样创建区域,方便代码阅读及维护?
     怎样创建矩形选区?

     下面就一条一条来详解:

     1.怎样给代码添加版权信息。

     写代码经常会要写一些版权信息、或者一些常用的命名空间引用,如果每个页面都拷贝粘贴一遍,确实挺麻烦的。有什么可以让我们一劳永逸的办法呢?vs中的模板功能来可以帮助我们达到这个目的。

     解决办法:   直接把D:Program FilesMicrosoft Visual Studio 8Common7IDEItemTemplates文件夹中的相应的模板压缩包Copy到C盘的My DocumentsVisual Studio 2005Templates中的相应位置,然后修改添加上自己要添加的信息。 然后在添加新项的时候选择“我的模板”下面的项即可。

     示意图如下:

WebForm模板

 

 

  

注意:WebSite模板和Web应用程序模板是不一样的。   

2.怎样给代码添加代码段?

     编码过程中,经常会有一些常用的代码结果会反复使用,有没有一种办法把这些代码嵌套到VS IDE中呢?

     解决办法:完全没问题,使用snippet文件能很好的解决这一问题。打开Program FilesMicrosoft Visual Studio 8VC#Snippets2052Visual C#里面有很多VS自带的snippet文件,你只需要复制一下,然后把它修改成自己的代码段即可。

     见图示:

     

     代码如下:

     

Code

 

使用:

如上图:找到自己设置的代码段的别名,输入回车键,然后输入tab键,即可自动生成如下代码:

 

3.怎样使用任务管理器?

     假如我们开发的项目很大,在项目中有些代码没有完成,我们可以做一下标记,便于将来查找

     VS中的任务管理器能够很好地解决这一问题,使用方法:在要标志的地方输入://TODO:内容,然后在视图——任务列表中打开所有的任务列表。

4.怎样使用发布网站功能?

     在我们部署Web应用程序的时候,像.cs等文件因为已经生成了dll,对部署站点是没有什么用处的,这个时候一般都是手动去删除这些没用的文件,有没有更快捷的办法来完成这项工作呢?VS自带的发布功能能够很好地解决这一问题。

     选中项目——右键属性——发布(Publish) 或者选择生成(Build)——发布(Publish)打开如下对话框:

     

5.怎样把备份常用代码,快捷方便下次使用?

     在编码过程中我们会经常编写一些重复的代码,怎样把这些代码备份起来,下次使用的时候能够快捷地调用出来呢?

     工具箱中的常用选项能够达到这个功能,把我们常用的代码拖放到工具箱中的常用选项卡中,下次使用的时候直接双击就行了。如下图:

     

6.怎样在同一个窗口中查看一个文档的不同部分?

直接见图:

     

拖动后下效果见下图:

看到了吗?一个文档被分成了两个!你可以在一个窗口中同时查看这个文档的头部和尾部。

怎样还原过去呢?直接拖动那个小条条,恢复原位就行了。

7.怎样创建区域,方便代码阅读及维护?

     添加

     #region

     //代码区域

     #endregion

8.怎样创建矩形选区?

     有时候我们只想复制一段代码的前几列,后几列不想复制,怎样才能达到这种效果呢?

     很简单,摁住alt键,然后拖动鼠标即可,效果如下:

     

来自:http://www.cnblogs.com/qqflying/archive/2008/11/19/1336094.html

Categories: ASP.net, Web Tags: , ,

MSSQL2005和C#时间字段格式化

June 8th, 2009 Tony hu No comments

MSSQL2005时间字段格式化
1 取值后格式化
{0:d}小型:如2005-5-6
{0:D}大型:如2005年5月6日
{0:f}完整型
2 当前时间获取
DateTime.Now.ToShortDateString

3 取值中格式化
SQL Server里面可能经常会用到的日期格式转换方法:
sql server使用convert来取得datetime日期数据,以下实例包含各种日期格式的转换
语句及查询结果:
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM

C#中Datetime的常用格式

用法大致如下,

DateTime curDate;

curDate.ToString(” D” ); 输出时间格式 2008年5月3日
curDate.ToString(” d” ); 输出时间格式 2008-5-3
curDate.ToString(“F” ); 输出时间格式 2008年5月3日 3:14:52
curDate.ToString(“f” ); 输出时间格式 2008年5月3日 3:14
curDate.ToString(“G” ); 输出时间格式 2008-5-3 3:14:52
curDate.ToString(“g” ); 输出时间格式 2008-5-3 3:14
curDate.ToString(“M” ); 输出时间格式 5月3日
curDate.ToString(“m” ); 输出时间格式 5月3日
curDate.ToString(“O” ); 输出时间格式 2008-05-03T03:14:52.8125000-05:00
curDate.ToString(“o” ); 输出时间格式 2008-05-03T03:14:52.8125000-05:00
curDate.ToString(“R” ); 输出时间格式 Sat, 03 May 2008 03:14:52 GMT
curDate.ToString(“r” ); 输出时间格式 Sat, 03 May 2008 03:14:52 GMT
curDate.ToString(“s” ); 输出时间格式 2008-05-03T03:14:52
curDate.ToString(“T” ); 输出时间格式 3:14:52
curDate.ToString(“t” ); 输出时间格式 3:14
curDate.ToString(“U” ); 输出时间格式 2008年5月3日 8:14:52
curDate.ToString(“u” ); 输出时间格式 2008-05-03 03:14:52Z
curDate.ToString(“Y” ); 输出时间格式 2008年5月
curDate.ToString(“y” ); 输出时间格式 2008年5月

4. DateTime 自定义格式

就是用一些参数组合起来的意思。相关参数如下

d 就是日期。 如1,2,20等。

dd就是二位数日期,如01, 02, 22等

ddd 就是三位字母的星期。如: Mon,Tue等

dddd就是星期的全名,如Monday, Sunday 等。

f 就是秒的小数部分。 如 SS.f,就是几秒几的意思。

ff就是秒的两位小数部分。fff, fffff,以及FF,FFF意思都差不多,就是几位小数的意思。

g就是在时间后面的额外部分,如B.C, A.D等等

h,0-12的小时。hh,两位表述的小时。

H,0-23的小时。HH,两位表述的小时。

K,表示当前的时区号。

m,mm,表示不限位和两位表示的分钟。

M,MMM,MMMM表示月份。分别如: 1, Jan, January

s, ss 表示不限位和两位的秒。如1, 01等

t, tt,表示上午下午, AM, 或者PM

y, yy, yyyy,yyyyy不同位数的年份

z,zz,zzzz不同位数的时区

操作时间函数————————-
1、比较时间大小的实验
string st1=”12:13″;
string st2=”14:14″;
DateTime dt1=Convert.ToDateTime(st1);
DateTime dt2=Convert.ToDateTime(st2);
DateTime dt3=DateTime.Now;
if(DateTime.Compare(dt1,dt2)>0)
msg.Text=st1+”>”+st2;
else
msg.Text=st1+”<"+st2;
msg.Text+="\r\n"+dt1.ToString();
if(DateTime.Compare(dt1,dt3)>0)
msg.Text+=”\r\n”+st1+”>”+dt3.ToString();
else
msg.Text+=”\r\n”+st1+”<"+dt3.ToString();

2、计算两个时间差值的函数,返回时间差的绝对值:
private string DateDiff(DateTime DateTime1,DateTime DateTime2)
{
string dateDiff=null;
try
{
TimeSpan ts1=new TimeSpan(DateTime1.Ticks);
TimeSpan ts2=new TimeSpan(DateTime2.Ticks);
TimeSpan ts=ts1.Subtract(ts2).Duration();
dateDiff=ts.Days.ToString()+"天"
+ts.Hours.ToString()+"小时"
+ts.Minutes.ToString()+"分钟"
+ts.Seconds.ToString()+"秒";
}
catch
{

}
return dateDiff;
}

3、实现计算DateTime1-36天=DateTime2的功能

TimeSpan ts=new TimeSpan(40,0,0,0);
DateTime dt2=DateTime.Now.Subtract(ts);
msg.Text=DateTime.Now.ToString()+"-"+ts.Days.ToString()+"天\r\n";
msg.Text+=dt2.ToString();

原文地址:http://worm128.blog.163.com/blog/static/5677214920081125814465/