关于日期显示格式字符串的一点理解

来源:互联网 发布:冒险岛v矩阵强化 编辑:程序博客网 时间:2024/05/02 03:05

http://www.cnblogs.com/longsan/archive/2006/04/05/367462.html

 

 

今天有网友在q群上贴了如下一段代码:

string s = Calendar1.TodaysDate.ToString("d");

想得到"MM/dd/yyyy"的显示方式,可是总是显示成"04-01-2006",而不是想要的"04/01/2006"。

一开始我也想当然的认为"MM/dd/yyyy" (自定义格式字符串) 或者用"d"
(标准格式字符串)来完成,但是经过实验,发现总是显示"04-01-2006"。后来查了帮助,对这个问题有了下面的一些认识:

1、标准格式字符串的显示是与程序运行机器上的本地区域有关的,即与CultrueInfo相关。比如你的机器上的本地区域设置里,设置日期之间的间隔符是"-",那么你通过上述代码显示的总是"-",除非你修改了本地区域的设置。

2、上述代码默认的美国英语的显示方式是"04/01/2006",中文的显示方式是"04-01-2006",德语的显示方式是"04.01.2006"。

3、如果不通过修改本地区域的设置,而想实现"04/01/2006"的显示方式,则应该使用自定义格式字符串,上面的代码可以写成下面这样:

string s = Calendar1.TodaysDate.ToString("MM'/'dd'/'yyyy");


其中两个单引号括着的是任意字符串,在显示时都会直接显示。

 

几种解决方案:

第一种如上面3所说的。

第二种

Web.Config中,添加:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" />

这是最方便的,但是没有试.

第三种

控制面板-〉区域选项-〉自定义(时间右边的按钮)  

可以,不过没有移植性.

 

关于一些资料参考:

日期格式化显示  
在SQL中DateTime为8位长度日期的指定形式为2003-12-31 00:00:00  
而在ASP.NET上最常用的只是2003-12-31号一部分而已你可以使用  
DateTime.Now.ToString("d")或DateTime.Now.ToShortDateString();  
不过具体格式是2003/12/31还是2003-12-31的话要看你的系统配置日期配置是哪一种.  
你要想确定取得2003-12-31指定的话使用.Tostring()用户自定义格式  
格式的字符可以看上面说到的文档.  
如.ToString("yyyy-MM-dd")返回2003-11-25  
.ToString("yyyyMMdd")返回20031125  

d 将日显示为不带前导零的数字(如 1)。如果这是用户定义的数字格式中的唯一字符,请使用  

%d。  
dd 将日显示为带前导零的数字(如 01)。  
ddd 将日显示为缩写形式(例如 Sun)。  
dddd 将日显示为全名(例如 Sunday)。  
M 将月份显示为不带前导零的数字(如一月表示为 1)。如果这是用户定义的数字格式中的唯一  

字符,请使用 %M。  
MM 将月份显示为带前导零的数字(例如 01/12/01)。  
MMM 将月份显示为缩写形式(例如 Jan)。  
MMMM 将月份显示为完整月份名(例如 January)。  
gg 显示时代/纪元字符串(例如 A.D.)  
h 使用 12 小时制将小时显示为不带前导零的数字(例如 1:15:15 PM)。如果这是用户定义的数  

字格式中的唯一字符,请使用 %h。  
hh 使用 12 小时制将小时显示为带前导零的数字(例如 01:15:15 PM)。  
H 使用 24 小时制将小时显示为不带前导零的数字(例如 1:15:15)。如果这是用户定义的数字  

格式中的唯一字符,请使用 %H。  
HH 使用 24 小时制将小时显示为带前导零的数字(例如 01:15:15)。  
m 将分钟显示为不带前导零的数字(例如 12:1:15)。如果这是用户定义的数字格式中的唯一字  

符,请使用 %m。  
mm 将分钟显示为带前导零的数字(例如 12:01:15)。  
s 将秒显示为不带前导零的数字(例如 12:15:5)。如果这是用户定义的数字格式中的唯一字符  

,请使用 %s。  
ss 将秒显示为带前导零的数字(例如 12:15:05)。  
F 显示秒的小数部分。例如,ff 将精确显示到百分之一秒,而 ffff 将精确显示到万分之一秒。  

用户定义格式中最多可使用七个 f 符号。如果这是用户定义的数字格式中的唯一字符,请使用 %f。  
T 使用 12 小时制,并对中午之前的任一小时显示大写的 A,对中午到 11:59 P.M 之间的任一小  

时显示大写的 P。如果这是用户定义的数字格式中的唯一字符,请使用 %t。  
tt 使用 12 小时制,并对中午之前任一小时显示大写的 AM;对中午到 11:59 P.M 之间的任一小  

时显示大写的 PM。  
y 将年份 (0-9) 显示为不带前导零的数字。如果这是用户定义的数字格式中的唯一字符,请使用  

%y。  
yy 以带前导零的两位数字格式显示年份(如果适用)。  
yyy 以四位数字格式显示年份。  
yyyy 以四位数字格式显示年份。  
z 显示不带前导零的时区偏移量(如 -8)。如果这是用户定义的数字格式中的唯一字符,请使用  

%z。  
zz 显示带前导零的时区偏移量(例如 -08)  
zzz 显示完整的时区偏移量(例如 -08:00)  

同样对时间也可以进行这样的格式化..你可以使用自定义格式来设置你想要的格式输出.  
你可以使用上表中各字符进行任意的组合不管前后次序多少如你写入yyyy-yyyy也是可以的.  

注意的是:进行格式化的一定要是日期DateTime格式.在SQL中的类型也一样.否则格式无效或出错.特别是在DataGrid常{0:IFromat}的格式中会用到  

2)日期的输入  
我们在办理入日期格式式常用DateTime.Pares()  
但是这个形式的转换是相当有限的,有些C#是会不懂你写入的日期格式的如20031231大家都明白是2003-  

12-31号可以C#不认识他.我们可以这样子进行如下  
//设置语言国家  
System.IFormatProvider format=new System.Globalization.CultureInfo("zh-CN",true);  
//指定转换格式  
Response.Write(DateTime.ParseExact(this.TextBox1.Text,"yyyyMMdd",format));  
这样他就能看出20031231号的日期格式了  

不过可惜他只能够对yyyyMMdd形式进行不能对其它格式进行转换是不是美中不足?  
不过.NET提供了另一种重载版本.  
public static DateTime ParseExact(string, string[], IFormatProvider, DateTimeStyles);  
可对指定的几种日期格式进行转换.