分析问题
DateTime对象输出到字符串的使用概率非常高,DateTime结构实现了四个ToString方法,下表列出了四个方法的特性:
方法 | 说明 |
ToString() | 效果等同于ToString("G")和ToString("G",null) |
DateTime.ToString(IFormatProvider) | 由用户提供的格式化对象来进行格式化 |
DateTime.ToString(String) | 由特定的字符串来表示各种格式 |
DateTime.ToString(String,IFormatProvider) | 由特定字符串表示的格式和区域性特定格式信息来进行格式化 |
ToString(String)方法和ToString(String,IFormatProvider)方法都接受一个字符串参数来表示特定的格式,而不同的是,ToString(String)方法使用本机的区域设置来进行格式化,而ToString(String,IFormatProvider)则使用了显示提供的区域设置对象。读者在使用ToString(String)方法时需要非常小心,因为这样的代码会在不同的客户机上产生不同的字符串。以下代码使用了DateTime常用的一些格式化字符串,并且比较了使用本地区域设置和不使用区域设置的区别。
using System; namespace Test { class DateTimeToString { static void Main() { DateTime now = DateTime.Now; //尝试各种format Display("d", now); Display("D", now); Display("f", now); Display("F", now); Display("g", now); Display("G", now); Display("m", now); Display("r", now); Display("s", now); Display("y", now); Display("t", now); Display("T", now); Display("u", now); Display("U", now); Display("dd-MM-yy", now); Console.Read(); } static void Display(string format, DateTime time) { //依赖本地区域设置 Console.WriteLine("使用区域设置{0}:{1}", format, time.ToString(format)); Console.WriteLine("不使用区域设置{0}:{1}\r\n", format, time.ToString(format, System.Globalization.DateTimeFormatInfo.InvariantInfo)); } } }
下面是程序的输出,读者可以清楚地看到依赖本地区域设置和不依赖本地区域设置的区别:
注意
以上代码的DateTime格式化字符串非常常用,读者应该考虑记住它们,以避免每次使用时都需要查阅产品文档。
读者已经了解了DateTime对象输出到字符串的方法,而相反的,DateTime也可以从一个字符串来获取信息来构造一个对象,也就需要用到DateTime的TryPase方法和Parse方法。Parse方法和ToString方法相互响应,实现了完全相反的功能,使用Parse方法时,也可以选择是否需要依赖本地的区域设置。当转换成功时,一个新的DateTime对象将被返回,而当转换失败时,将会抛出一个FormatException异常。由于异常控制程序将会对性能有较大的影响,在进行不确定转换时,使用TryParse方法进行尝试是一个很好的解决方案,当提供的字符串可转换为一个DateTime对象时,该方法会返回true并且进行转换,否则返回false。下面的代码展示了TryParse方法的使用:
string s="2014-8-19 14:17:22"; DateTime t; if(DateTime.TryParse(s,out t) { Console.WriteLine(t.ToString()); }
答案
DateTime可通过ToString方法来格式化输出到字符串,而相反地,TryParse和Parse方法则用来从一个字符串中得到信息并构造一个DateTime对象。
如何在DateTime对象和字符串对象之间进行转换