DateTime - jak zmienić domyslną implementacje ToString()

0

Cześć,
Czy ma ktoś może jakiś pomysł jak zmienic domyslną implementacje ToString dla klasy DateTime ?
obecnie ToString() zwraca wersje angielska "Oct 19 2018 8:00AM"

Uprzedzam że nie moge użyć tutaj innych przeciążeń metody jak ToString("dd.MM.yy H.mm") itd a także rozszerzeń dla DateTime. Muszę użyć "czystego" ToString();

Aplikacja jest aplikacją webową więc probowałem ustawic w web.config

<globalization culture ="pl-PL" uiCulture="pl"> 

a także ustawiać to w bieżącym wątku

using(var db = new CarContext()){
   Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
   var model = db.Car.Where(expression);

   if(model.Any())
      return model.ProjectTo<T>.ToList();
   else{
     return new List<T>(); 
   }
}

Dodałem jeszcze w global.asax

protected void Application_Start(){
....
 Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
...
}

protected void Application_BeginRequest(){
....
 Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
...
}

Niestety nadal mapuje mi to do daty w wersji angielskiej. Ma ktoś może jakiś pomysł ?
Pozdrawiam

1

Nie wiem czy zadziała to w C#(javoviec here), ale mógłbyś zrobić po prostu zrobić klasę np: CustomDateTime która rozszerza DateTime i tam ustalić sobie domyślną impl toString i używać tej customowej klasy?

1

Na 90% jest to problem XY - wydaje mi się że próbujesz zrobić coś co tak naprawdę jest obejściem dla prawdziwego problemu. Napisz ~user stories dla tego zachowania.

0
albundy napisał(a):

Nie wiem czy zadziała to w C#(javoviec here), ale mógłbyś zrobić po prostu zrobić klasę np: CustomDateTime która rozszerza DateTime i tam ustalić sobie domyślną impl toString i używać tej customowej klasy?

Niestety nie moge użyć rozszerzenia klasy DateTime :/

A co dotyczy całej historii, chodzi o automappera i mapowanie na poziomie IQueryable.

http://docs.automapper.org/en/stable/Queryable-Extensions.html
Kod jest trochę zawiły więc opowiem na prostszym przykładzie :

A więc tak w profilu chciałem od razu umieścić format daty a więc :
CreateMap<Car,IBuyDate>
.ForMember(d=>d.BuyDate, o.MapFrome(s=>s.Car.BuyDate.ToString("dd.MM.yy H.mm")))
;

i przy pobieraniu danych z bazy od razu zmapować kodem :

using(var db = new CarContext()){
   var model = db.Car.Where(expression);

   if(model.Any())
      return model.ProjectTo<T>.ToList();
   else{
     return new List<T>(); 
   }
}

Niestety w takim przypadku pojawia się błąd podczas wykonywania :

"Linq to Entitties does not recognize the method "System.String ToString(System.String));" method, and this method cannot be translated into a store expression"

Jedyne co przechodzi to gdy w Profilu zmienię na linijkę

.ForMember(d=>d.BuyDate, o.MapFrome(s=>s.Car.BuyDate.ToString()))

No ale nie jest to do końca to co chcę, bo rzuca mi datę w konwencji angielskiej.

0

Spróbuj może to

CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "dd MM yy H mm";
newCulture.DateTimeFormat.DateSeparator = ".";
Thread.CurrentThread.CurrentCulture = newCulture;
0

Nie wiem czy to chodzi o C# ale wątpię .
Datę można formatować na wiele sposobów np tak :

  using System;
using System.Globalization;
 
namespace ConsoleApp79
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime date = DateTime.Now;
            CultureInfo kultura1 = new CultureInfo("Pl-pl");
            CultureInfo kultura2 = new CultureInfo("En-us");
            string stringDate1 = date.ToString(kultura1);
            string stringDate2 = date.ToString(kultura2);
            string stringDate3 = date.ToString("dd.mm.yyyy");
            Console.WriteLine(stringDate1);
            Console.WriteLine(stringDate2);
            Console.WriteLine(stringDate3);
        }
    }
}
2

Problem bierze się stąd, że robisz coś, co nie ma sensu tam, gdzie chcesz to zrobić. Po co w ogóle konwertujesz na string na tym poziomie? Od wyświetlania ładnie sformatowanych danych jest warstwa prezentacji, a nie warstwa dostępu do danych.

0

Hej,
Kilka rzeczy

  1. Pamiętajcie że ustawienie CurrentCulture jest na obecnym wątku. Nie znamy całej aplikacji, ale trzeba na to uważać.
  2. Linq to Entities nie buduje się do C# ale do SQL, czyli z poziomu kodu "sklejamy" sobie SQLa, który jest wywoływany na bazie w ToList() także format daty określany jest w tym przypadku przez bazę. To raczej tam jest ustawiony taki format.
  3. Tak jak wspomniał @somekind formatowanie daty powinno odbywać się na UI. Tym bardziej, że np. mając użytkowników w różnych strefach czasowych i kulturach powinni oni zobaczyć inne wartości tego samego 'momentu w czasie'
  4. Ogólnie co do dat i czasu polecam w wolnej chwili pogooglać John Skeet + NodaTime
0

Chcialem po prostu poprawie skonwertować czas już na poziomie pobierania z bazy danych ponieważ tam używam automappera który rzutuje mi to na ViewModel

1 użytkowników online, w tym zalogowanych: 0, gości: 1