0

我正在创建第三方库使用的 DateTimes(我当然无法控制)。我正在使用这个 3rd 方库来编写一些文件,包括我正在创建的 DateTimes。

我想以不同的格式打印我的日期,但我无法控制第三方如何转换 DateTime,并且我无法在每个 DateTime 转换之间更改我的文化信息,我也不能继承 DateTime 来覆盖 ToString(就像没有人一样能够)。

有没有办法将特定格式绑定到 DateTime 以便每次调用 ToString 方法都使用这种格式?

DateTime firstDate = new DateTime(2013, 02, 07); //I would like this DateTime to be printed this way: 2013-02-07
DateTime secondDate = new DateTime(2013, 02, 07); //I would like this DateTime to be printed this way: Thursday, February 07, 2013

thirdPartyLib.SetFirstDate(firstDate);
thirdPartyLib.SetSecondDate(secondDate);
thirdPartyLib.PrintBothDate(); //This method convert both DateTime in strings
4

5 回答 5

1

如果您确定 set datetime 方法将调用ToString()并将其保存在您的第三方库中,那么您可以使用以下类

public static class ThirdPartyLibHelper {
    public static void SetSecondDate(DateTime dateTime) {
        Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo("en-Us");
        var dateTimeFormat=Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        dateTimeFormat.SetAllDateTimePatterns(new[] { "" }, 'T');
        dateTimeFormat.SetAllDateTimePatterns(new[] { "yyyy-MM-dd" }, 'd');
        thirdPartyLib.SetSecondDate(dateTime);
    }

    public static void SetFirstDate(DateTime dateTime) {
        Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo("en-Us");
        var dateTimeFormat=Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        dateTimeFormat.SetAllDateTimePatterns(new[] { "" }, 'T');
        dateTimeFormat.SetAllDateTimePatterns(new[] { "dddd, MMMM dd, yyyy" }, 'd');
        thirdPartyLib.SetFirstDate(dateTime);
    }
}

测试代码

DateTime firstDate=new DateTime(2013, 02, 07);
DateTime secondDate=new DateTime(2013, 02, 07);

ThirdPartyLibHelper.SetSecondDate(firstDate);
var secondDateString=secondDate.ToString();

ThirdPartyLibHelper.SetFirstDate(firstDate);
var firstDateString=firstDate.ToString();

Debug.Print("{0}", firstDateString);
Debug.Print("{0}", secondDateString);

如果您的库在您调用SetFirstDate()or时没有将日期时间保存为格式化字符串SetSecondDate(),则它不起作用。

于 2013-02-07T12:15:29.067 回答
0

试试这个(分配给具有特定格式的字符串);

每次调用ToString方法都会使用这种格式?

string firstDate = new DateTime(2013, 02, 07).ToString("yyyy-MM-dd");
string secondDate  = new DateTime(2013, 02, 07).ToString("dddd, MMMM dd, yyyy");
于 2013-02-07T10:41:51.460 回答
0

无法在DateTime您希望用于ToString()方法的格式中进行设置。

System.DateTime是一个sealed类,这意味着你不能扩展。
相反,您可以创建自己的 Date 类,以便您可以指定它。

public class DateTimeWithFormat
{

  public DateTime Date {get; set;}
  public string Format {get; set;}

  //ToString override using custom format
  public override string ToString 
   {
     return Date.ToString (Format);
     }    

 //Constructor sets date and format
  public DateTimeWithFormat( DateTime date, string format )
   {
     Date= date;
     Format = format;
    }
}

这样你就可以使用这种方式

DateTimeWithFormat firstDate = new DateTimeWithFormat(
           new DateTime(2013, 02, 07),
           "yyyy-MM-dd");
DateTime secondDate = new DateTimeWithFormat(
           new DateTime(2013, 02, 07),
           "dddd") ; 

thirdPartyLib必须改为使用DateTimeWithFormat 而不是DateTime

于 2013-02-07T10:49:07.463 回答
0

根据您问题中提供的信息,解决此问题的唯一方法是实现您自己的打印库。

或者如果 3rd 方库是可扩展的(我怀疑它,因为你提到你无法控制它)然后覆盖PrintBothDate()以满足你的需要。

于 2013-02-07T10:56:28.160 回答
0

不幸的是,这是不可能的。你必须解决这个问题:

thirdPartyLib.SetFirstDate(firstDate);
thirdPartyLib.SetSecondDate(secondDate);
thirdPartyLib.PrintString(firstData.ToString(firstDateFormatting)); //Assuming such a method exists
thirdPartyLib.PrintString(secondDate.ToString(secondDateFormatting));
于 2013-02-07T10:59:26.590 回答