Dzień dobry,
w jaki sposób mogę rozwiązania problem z formatem daty, który używany jest w obrazie Docker. W moim przypadku jest to obraz ASP.NET Core (mcr.microsoft.com/dotnet/aspnet:6.0).
System w obrazie wyświetla dane w formacie dzień/miesiąc/rok, a moja aplikacja pracuje w systemie rok-miesiąc-dzień.
Wiem że mogę to rozwiązać od strony C#, ale chciałem się upewnić czy nie ma innej możliwości.
Pozdrawiam,
Łukasz
Aplikacja z obrazu aspnet:6.0 formatuje datę w nieodpowiedni sposób
- Rejestracja: dni
- Ostatnio: dni
- Postów: 283
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1620
Nie dostarczył(a/e)ś większości informacji potrzebnych do rozwiązania Twojego problemu, ale…
Możesz ustawić ustawienia lokalizacji w Dockerze, na przykład, dodając ENV LC_TIME (co tam chcesz) do dockerfile’a. W szczególności, en_DK.UTF-8 zachowuje standard ISO 8601, czyli Y-MM-DD. Upewnij się też, że masz odblokowane odpowiednie ustawienie w /etc/locale.gen. Szczegóły zależą, m.in., od dystrybucji, na której bazujesz obraz.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
- Rejestracja: dni
- Ostatnio: dni
- Postów: 283
Althorion napisał(a):
Nie dostarczył(a/e)ś większości informacji potrzebnych do rozwiązania Twojego problemu, ale…
Możesz ustawić ustawienia lokalizacji w Dockerze, na przykład, dodając
ENV LC_TIME (co tam chcesz)do dockerfile’a. W szczególności,en_DK.UTF-8zachowuje standard ISO 8601, czyliY-MM-DD. Upewnij się też, że masz odblokowane odpowiednie ustawienie w/etc/locale.gen. Szczegóły zależą, m.in., od dystrybucji, na której bazujesz obraz.
Mam nadal problem z moją aplikacją :(
Zmieniłem format daty w obrazie Docker na właściwą postać.

Update:
Dodam że w środowisku Deweloperskim data wyświetla się w prawidłowym dla mnie formacie czyli: YYYY-MM-DD.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
Ale co Ty próbujesz osiągnąć? Dlaczego aplikacja ma być przywiązana do jakiegoś konkretnego formatu daty?
Ogólnie, to żaden z tych formatów nie jest prawidłowy w Polsce.
Obraz dockera ma zapewne wymuszone en-US, dlatego ma najgłupszy z możliwych zapis daty. Pytanie, na jakim systemie ten obraz dockera bazuje?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2310
virusek391 napisał(a):
a moja aplikacja pracuje w systemie rok-miesiąc-dzień.
Powinna pracować w formacie "żaden", bo na typie datowym.
Na nielicznych wejściach i wyjściach formatowanie do plików w zadanym standardzie (a najlepiej ISO)
virusek391 napisał(a):
Natomiast jak uruchamiam moją aplikację na Windowsie to dane wyświetlają się w takiej postaci:
Update:
Dodam że w środowisku Deweloperskim data wyświetla się w prawidłowym dla mnie formacie czyli: YYYY-MM-DD.
Przeczuwam, że walczymy z olbrzymim XY problemem, np w 2765 odcinku serialu się dowiemy, że "wyświetla się" dotyczy aplikacji JavaScriptowej.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 283
Aplikacja została utworzona w ASP.NET Core, więc pobrałem obraz Dockera z tej strony: https://hub.docker.com/_/microsoft-dotnet-aspnet
Serwer Docker postawiony jest na Debianie i tutaj udało mi się ustawić format LC_TIM=en_DK.UTF-8

Jednak z tego co widzę to prawdopodobnie problem występuje po uruchomieniu w aplikacji w samym Dockerze, ponieważ nie przyjmuje ustawień związanych z datą
Oto zawartość pliku Dockerfile:
FROM asp_net_core_6
WORKDIR /Fronted
COPY /Fronted/ ./
WORKDIR /Backend
COPY /Backend/ ./
ENV LC_TIME="en_DK.UTF-8"
ENV DATE_FORMAT="%Y-%m-%d"
Update:
Obraz w dokerze również ma format daty YYYY-MM-DD. Więc z skąd on bierze taki dziwny układ w samej aplikacji MM/dd/yyyy?

- Rejestracja: dni
- Ostatnio: dni
- Postów: 2310
virusek391 napisał(a):
. Więc z skąd on bierze taki dziwny układ w samej aplikacji MM/dd/yyyy?
Z aplikacji. Mało ściśle napisanej aplikacji.
Zobaczymy jej źródła ?
(chciałem załączyć filmik z PRL-u, ale nie znalazłem)
W dobrze zaprojektowanej aplikacji rzadko (nie mówię, ze nigdy, bo czasem tak) powinieneś stanąć wobec problemu formatowania.
O ile to jest ważne, powinno być kontrolowane, każda funkcja formatująca oprócz swej najprostszej formy, ma formy wieloargumentowe, które nie dają automatyki wyboru.
- Rejestracja: dni
- Ostatnio: dni
Miałem podobną sytuację (chodziło co prawda nie tylko o datę, ale o całe locale) i oprócz ustawienia LANG czy tam LC_TIME, trzeba było jeszcze wygenerować locale przez localedef. Akurat na przykładzie pl_PL.UTF8, ale mój Dockerfile wyglądał tak:
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i pl_PL -c -f UTF-8 -A /usr/share/locale/locale.alias pl_PL.UTF-8
ENV LANG pl_PL.UTF-8
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["TimeSlotFinder_Razor/TimeSlotFinder_Razor.csproj", "TimeSlotFinder_Razor/"]
COPY ["TimeSlotFinder_Logic/TimeSlotFinder_Logic.csproj", "TimeSlotFinder_Logic/"]
RUN dotnet restore "TimeSlotFinder_Razor/TimeSlotFinder_Razor.csproj"
COPY . .
WORKDIR "/src/TimeSlotFinder_Razor"
RUN dotnet build "TimeSlotFinder_Razor.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "TimeSlotFinder_Razor.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TimeSlotFinder_Razor.dll"]
- Rejestracja: dni
- Ostatnio: dni
- Postów: 283
Ktos napisał(a):
Miałem podobną sytuację (chodziło co prawda nie tylko o datę, ale o całe locale) i oprócz ustawienia LANG czy tam LC_TIME, trzeba było jeszcze wygenerować locale przez localedef. Akurat na przykładzie pl_PL.UTF8, ale mój Dockerfile wyglądał tak:
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \ && localedef -i pl_PL -c -f UTF-8 -A /usr/share/locale/locale.alias pl_PL.UTF-8 ENV LANG pl_PL.UTF-8 WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["TimeSlotFinder_Razor/TimeSlotFinder_Razor.csproj", "TimeSlotFinder_Razor/"] COPY ["TimeSlotFinder_Logic/TimeSlotFinder_Logic.csproj", "TimeSlotFinder_Logic/"] RUN dotnet restore "TimeSlotFinder_Razor/TimeSlotFinder_Razor.csproj" COPY . . WORKDIR "/src/TimeSlotFinder_Razor" RUN dotnet build "TimeSlotFinder_Razor.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "TimeSlotFinder_Razor.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "TimeSlotFinder_Razor.dll"]
Niestety twój kod również nie pomógł w moim w przypadku, nawet jak pozmieniałem pl_PL.UTF-8 na en_DK.UTF-8 ale dzięki :)
Ja wcześniej miałem taką zawartość pliku Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:6.0
RUN apt-get update && apt-get install -y locales
# Ustawienie odpowiedniej lokalizacji czasowej
RUN echo "en_DK.UTF-8 UTF-8" > /etc/locale.gen && \
locale-gen en_DK.UTF-8 && \
update-locale LANG=en_DK.UTF-8 \
update-locale LC_ALL="en_DK.UTF-8"
# Ustawienie zmiennej środowiskowej LC_TIME na en_DK.UTF-8
ENV LC_TIME="en_DK.UTF-8"
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
@virusek391: moim skromnym zdaniem trochę od "złej" podchodzisz do problemu, skoro uważasz że jest źle to szukasz miejsca w którym ta data się wyświetla, próbujesz zrozumieć w jaki sposób kawałek obszaru pamięci komputera (zmienna) zostaje zamieniona na pixele. Format może być ustawiony a wiele sposobów dla systemu, środowiska, aplikacji, danego fragmentu kodu albo jako parametr funkcji (zależy co kto ma w swoim arsenale możliwości)
Takie ustawianie na chybił trafił niczego Cie nie nauczy a dodatkowo chatgpt za-indeksuje to jako potencjalne rozwiązanie dla innych :D
- Rejestracja: dni
- Ostatnio: dni
- Postów: 283
Ustawiłem formatowanie na poziomie aplikacji w miejscach gdzie było to wymagane.
Zajęło to 10 minut :)