我最近使用DateTime
对象,并写了这样的东西: 多线程
DateTime dt = DateTime.Now; dt.AddDays(1); return dt; // still today's date! WTF?
AddDays()
的intellisense文档说它在日期中添加了一天,但它没有 - 它实际上返回了添加了一天的日期,所以您必须将其写为: spa
DateTime dt = DateTime.Now; dt = dt.AddDays(1); return dt; // tomorrow's date
这个曾经屡次咬过我,因此我认为编制最糟糕的C#陷阱会颇有用。 线程
DateTime.ToString(“dd / MM / yyyy”) ; 这实际上并不总能给你dd / MM / yyyy,而是会考虑区域设置并根据你所在的位置替换你的日期分隔符。 因此你可能会获得dd-MM-yyyy或相似的东西。 code
正确的方法是使用DateTime.ToString(“dd'/'MM'/'yyyy”); orm
DateTime.ToString(“r”)应该转换为使用GMT的RFC1123。 GMT距离UTC只有几分之一秒,但“r”格式说明符不会转换为UTC ,即便有问题的DateTime被指定为Local。 对象
这致使如下问题(取决于您的本地时间与UTC的距离): 文档
DateTime.Parse("Tue, 06 Sep 2011 16:35:12 GMT").ToString("r") > "Tue, 06 Sep 2011 17:35:12 GMT"
哎呦! get
今天我修了一个很长时间没收的错误。 该错误位于多线程场景中使用的泛型类中,而静态int字段用于使用Interlocked提供无锁同步。 该错误是因为类型的泛型类的每一个实例化都有本身的静态引发的。 所以每一个线程都有本身的静态字段,并无按预期使用锁。 同步
class SomeGeneric<T> { public static int i = 0; } class Test { public static void main(string[] args) { SomeGeneric<int>.i = 5; SomeGeneric<string>.i = 10; Console.WriteLine(SomeGeneric<int>.i); Console.WriteLine(SomeGeneric<string>.i); Console.WriteLine(SomeGeneric<int>.i); } }
这打印5 10 5 string
我参加这个聚会有点晚了,但我最近有两个问题都咬了我:
Ticks属性测量时间为百万分之一秒(100纳秒块),但分辨率不是100纳秒,大约是15毫秒。
这段代码:
long now = DateTime.Now.Ticks; for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1); Console.WriteLine(DateTime.Now.Ticks - now); }
会给你一个输出(例如):
0 0 0 0 0 0 0 156254 156254 156254
相似地,若是你查看DateTime.Now.Millisecond,你将得到15.625ms的圆形块的值:15,31,46等。
这种特殊行为因系统而异 ,但在此日期/时间API中还有其余与分辨率相关的问题 。
组合文件路径的好方法,但它并不老是按照您指望的方式运行。
若是第二个参数以\\
字符开头,它将不会为您提供完整的路径:
这段代码:
string prefix1 = "C:\\MyFolder\\MySubFolder"; string prefix2 = "C:\\MyFolder\\MySubFolder\\"; string suffix1 = "log\\"; string suffix2 = "\\log\\"; Console.WriteLine(Path.Combine(prefix1, suffix1)); Console.WriteLine(Path.Combine(prefix1, suffix2)); Console.WriteLine(Path.Combine(prefix2, suffix1)); Console.WriteLine(Path.Combine(prefix2, suffix2));
给你这个输出:
C:\MyFolder\MySubFolder\log\ \log\ C:\MyFolder\MySubFolder\log\ \log\
[Serializable] class Hello { readonly object accountsLock = new object(); } //Do stuff to deserialize Hello with BinaryFormatter //and now... accountsLock == null ;)
故事的道德:反序列化对象时不会运行字段初始化器
MS SQL Server没法处理1753年以前的日期。重要的是,这与.NET DateTime.MinDate
常量(1/1/1)不一样步。 所以,若是你试图保存一个思想,一个畸形的日期(最近发生在个人数据导入中)或者仅仅是征服者威廉的出生日期,你就会遇到麻烦。 没有内置的解决方法; 若是您可能须要在1753年以前使用日期,则须要编写本身的解决方法。