C#:日期格式的代码优化
C#: Code Optimization for Date Formatting
我正在使用 C# 尝试使用已知文件名 + 日期填充变量。问题是日期必须始终是上个月的最后一天。它也必须没有斜杠或连字符,并且年份必须是两位数。例如,如果现在是 2015 年 11 月 27 日,我需要我的文件名是:Foobar_103115.txt
作为一个还有很多东西要学的程序员,我写了下面的笨拙代码,它确实达到了我想要的结果,尽管它显然会在本世纪末之后崩溃。我的代码是这样写的,因为我想不出更直接的语法来获取我想要的日期,完成指定的格式。
我的问题是:重新创建以下代码的更优雅、更高效的方法是什么?
我已经为可能对此感兴趣的任何新手程序员注释了所有代码。我知道我要寻求帮助的专家不需要它。
public void Main()
{
String Filename
DateTime date = DateTime.Today;
var FirstDayOfThisMonth = DateTime.Today.AddDays(-(DateTime.Today.Day - 1)); //Gets the FIRST DAY of each month
var LastDayOfLastMonth = FirstDayOfThisMonth.AddDays(-1); //Subtracts one day from the first day of each month to give you the last day of the previous month
String outputDate = LastDayOfLastMonth.ToShortDateString(); //Reformats a long date string to a shorter one like 01/01/2015
var NewDate = outputDate.Replace("20", ""); //Gives me a two-digit year which will work until the end of the century
var NewDate2 = NewDate.Replace("/", ""); //Replaces the slashes with nothing so the format looks this way: 103115 (instead of 10/31/15)
Filename = "Foobar_" + NewDate2 + ".txt"; //concatenates my newly formatted date to the filename and assigns to the variable
听起来你想要的更像是:
// Warning: you should think about time zones...
DateTime today = DateTime.Today;
DateTime startOfMonth = new DateTime(today.Year, today.Month, 1);
DateTime endOfPreviousMonth = startOfMonth.AddDays(-1);
string filename = string.Format(CultureInfo.InvariantCulture,
"FooBar_{0:MMddyy}.txt", endOfPreviousMonth);
我肯定不会在这里使用ToShortDateString
- 你想要一个非常具体的格式,所以具体表达。 ToShortDateString
的结果将根据当前线程的文化而有所不同。
另请注意我的代码如何仅评估 DateTime.Today
一次 - 这是一个养成的好习惯,否则如果时钟 "ticks" 进入第二天 [=13= 的两次评估之间],您的原始代码可能会产生一些非常奇怪的结果。
我正在使用 C# 尝试使用已知文件名 + 日期填充变量。问题是日期必须始终是上个月的最后一天。它也必须没有斜杠或连字符,并且年份必须是两位数。例如,如果现在是 2015 年 11 月 27 日,我需要我的文件名是:Foobar_103115.txt
作为一个还有很多东西要学的程序员,我写了下面的笨拙代码,它确实达到了我想要的结果,尽管它显然会在本世纪末之后崩溃。我的代码是这样写的,因为我想不出更直接的语法来获取我想要的日期,完成指定的格式。
我的问题是:重新创建以下代码的更优雅、更高效的方法是什么?
我已经为可能对此感兴趣的任何新手程序员注释了所有代码。我知道我要寻求帮助的专家不需要它。
public void Main()
{
String Filename
DateTime date = DateTime.Today;
var FirstDayOfThisMonth = DateTime.Today.AddDays(-(DateTime.Today.Day - 1)); //Gets the FIRST DAY of each month
var LastDayOfLastMonth = FirstDayOfThisMonth.AddDays(-1); //Subtracts one day from the first day of each month to give you the last day of the previous month
String outputDate = LastDayOfLastMonth.ToShortDateString(); //Reformats a long date string to a shorter one like 01/01/2015
var NewDate = outputDate.Replace("20", ""); //Gives me a two-digit year which will work until the end of the century
var NewDate2 = NewDate.Replace("/", ""); //Replaces the slashes with nothing so the format looks this way: 103115 (instead of 10/31/15)
Filename = "Foobar_" + NewDate2 + ".txt"; //concatenates my newly formatted date to the filename and assigns to the variable
听起来你想要的更像是:
// Warning: you should think about time zones...
DateTime today = DateTime.Today;
DateTime startOfMonth = new DateTime(today.Year, today.Month, 1);
DateTime endOfPreviousMonth = startOfMonth.AddDays(-1);
string filename = string.Format(CultureInfo.InvariantCulture,
"FooBar_{0:MMddyy}.txt", endOfPreviousMonth);
我肯定不会在这里使用ToShortDateString
- 你想要一个非常具体的格式,所以具体表达。 ToShortDateString
的结果将根据当前线程的文化而有所不同。
另请注意我的代码如何仅评估 DateTime.Today
一次 - 这是一个养成的好习惯,否则如果时钟 "ticks" 进入第二天 [=13= 的两次评估之间],您的原始代码可能会产生一些非常奇怪的结果。