DateTime - jak zmienić domyslną implementacje ToString()

DateTime - jak zmienić domyslną implementacje ToString()
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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

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

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

Kopiuj
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

Kopiuj
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

edytowany 1x, ostatnio: ice25
ZK
AL
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:84
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?

LP
  • Rejestracja:około 7 lat
  • Ostatnio:około miesiąc
  • Postów:366
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.

I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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 :

Kopiuj
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ę

Kopiuj
.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.

edytowany 1x, ostatnio: ice25
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

Spróbuj może to

Kopiuj
CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "dd MM yy H mm";
newCulture.DateTimeFormat.DateSeparator = ".";
Thread.CurrentThread.CurrentCulture = newCulture;
edytowany 1x, ostatnio: AdamWox
I2
Zastosowałem twój kod niestety bez rezultatu. Co najśmieszniejsze gdy pobieram obecny język to pokazuje mi że mam ustawiony "pl-PL" (1 linijka)
AdamWox
No to dziwne to jest bardzo. Zrobiłem dla testu u siebie i mimo iż mam pl czy inne to robi mi taki format jak podałem wyżej w ShortDatePattern. Cieżko powiedzieć czego to może być przyczyna. Dla ścisłości zaraz pod Thread.CurrentThread.CurrentCulture = newCulture miałem DateTime.Now.ToString()
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:6 miesięcy
  • Postów:273
0

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

Kopiuj
  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);
        }
    }
}
edytowany 2x, ostatnio: Zimny Krawiec
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Wrocław
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.

ZK
Data jest przechowywana w pamięci zawsze w ten sam sposób tylko później się ją formatuje . Wszystko się mieści w 8 bajtach
somekind
A po co o tym do mnie piszesz? Jeśli to uwaga do autora tematu, to pisz w poście, nie komentarzu.
ZK
Не расстраивайся ;))
somekind
Nie znam staroegipskiego. :(
creyn
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:6
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
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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

ZK
Jeśli chodzi o typ DateTime to czasu się konwertuje tylko co najwyżej formatuje albo inaczej interpretuje w zależności od użytego kalendarza

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.