C # изменение форматирования для одного DateTime

Я создаю DateTimes, которые используются сторонней библиотекой (на которой я, конечно, не контролирую). Я использую эту стороннюю библиотеку для записи некоторых файлов, включая 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
0
Нет, это невозможно.
добавлено автор Daniel Hilgarth, источник
@Pandian: Как это помогает? Формат по умолчанию не может быть одновременно одним из требуемых форматов.
добавлено автор Daniel Hilgarth, источник
Попробуйте декомпилировать PrintBothDate и посмотреть, что именно там точно . Какие типы преобразований он использует. Возможно, могут быть обручи, чтобы вы могли изменить поведение.
добавлено автор Ilya Ivanov, источник
Вы пытались установить формат даты по умолчанию, используя CultureInfo ..?
добавлено автор Pandian, источник
Хорошо, если третья сторона пишет формат, и у вас нет средств для ее контроля, я думаю, вам придется читать файл и вносить изменения! !
добавлено автор V4Vendetta, источник

5 ответы

Если вы уверены в том, что установленные методы 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() или SetSecondDate() , это не сработает.

1
добавлено
Согласовано - сторонняя библиотека должна будет поддерживать предоставление пользовательского формата, если пользователь хочет этот уровень контроля.
добавлено автор Matt Johnson, источник
Это новая идея, но, скорее всего, она не сработает. Скорее всего, сторонняя библиотека принимает дату и сохраняет ее как дату, пока она не выведет ее. В этом случае, независимо от информации о культуре, когда его метод thirdPartyLib.PrintBothDate() запускается, тот, который будет использоваться для обеих дат. Кроме того, я бы, вероятно, захотел обернуть это в вспомогательный класс, который реализует IDisposable , чтобы его можно было использовать с с помощью , который возвращает культуру в нормальное состояние, сделайте с ним.
добавлено автор Matt Johnson, источник
@Matt Johnson: Кроме возможности, которую можно сделать с этим, почти невозможно сделать. Этот вопрос, скорее всего, является логической ошибкой.
добавлено автор Ken Kin, источник

К сожалению, это невозможно. Вам придется обойти эту проблему:

thirdPartyLib.SetFirstDate(firstDate);
thirdPartyLib.SetSecondDate(secondDate);
thirdPartyLib.PrintString(firstData.ToString(firstDateFormatting)); //Assuming such a method exists
thirdPartyLib.PrintString(secondDate.ToString(secondDateFormatting));
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");
0
добавлено
Это лишь небольшая часть вопроса very . Важная часть состоит в том, что ToString называется not , вызванным его кодом, но третьим кодом, который у него нет.
добавлено автор Daniel Hilgarth, источник
Это предполагает, что SetFirstDate и SetSecondDate принимает объект , а не DateTime ). Хотя возможно, вопрос, похоже, подразумевает, что это не так.
добавлено автор Daniel Hilgarth, источник
Каждый вызов метода ** ToString ** будет использовать это форматирование? Это его вопрос.
добавлено автор Kaf, источник
Я думаю, вы должны еще раз прочитать вопрос
добавлено автор V4Vendetta, источник
Что это значит, когда библиотека принимает DateTime ?
добавлено автор Aphelion, источник

Невозможно установить внутри DateTime формат, который вы ожидаете использовать для метода ToString() .

System.DateTime is a sealed class which means that you cannot extend.
You can, instead, create your own Date class so that you can specify it.

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

0
добавлено
-1: ОП четко заявила, что он не имеет контроля над третьей стороной библиотеки.
добавлено автор Daniel Hilgarth, источник
@ Kaf: Он этого не думает.
добавлено автор Daniel Hilgarth, источник
-1, потому что он не имеет контроля над другой библиотекой, что делает ваш ответ не полезным вообще.
добавлено автор Daniel Hilgarth, источник
@ DanielHilgarth: если он не контролирует эту библиотеку, почему он думает, что у нас есть? лол
добавлено автор Kaf, источник
DateTime secondDate = new DateTimeWithFormat будет ли эта компиляция?
добавлено автор Ilya Ivanov, источник
Нет, не будет компилироваться: System.DateTime - это запечатанный класс, который означает, что вы не можете распространяться. thirdPartyLib необходимо изменить, чтобы использовать DateTimeWithFormat вместо DateTime
добавлено автор Emanuele Greco, источник
@DanielHilgarth почему -1? В первом заявлении я отвечаю «нет, это невозможно», тогда я предлагаю обходное решение, которое требует контроля над типами сторонних библиотек, а не сторонней логикой .. если это возможно!
добавлено автор Emanuele Greco, источник
@DanielHilgarth ответ на вопрос «Есть ли способ привязать определенное форматирование к DateTime, чтобы каждый вызов метода ToString использовал это форматирование?» «Нет, tirdPartyLib должен быть изменен для использования другого класса вместо DateTime»; код должен дать повод для этого ответа
добавлено автор Emanuele Greco, источник

С информацией, приведенной в вашем вопросе, единственный способ решить эту проблему - реализовать свою собственную библиотеку печати.

или если сторонняя библиотека расширяема (я сомневаюсь, что с тех пор, как вы упомянули, что у вас нет контроля над ней), переопределите PrintBothDate() в соответствии с вашими потребностями.

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot