Регистрация  |  Вход

Date Formatting 12/31 incorrectly adding a year

Сегодня столкнулся с любопытной ошибкой которая скрывалась в коде которому уже 100500 лет.
Клиент написал что в PDF вместо 12/31/2025 видит 12/31/2026 хотя в записи дата корректная.
Смотрю, а там ломаться вроде нечему. Вот такой код
<apex:outputText style="white-space: nowrap;" value="{0, date, MM/dd/YYYY}">
     <apex:param value="{!p.paymentDate}" />
</apex:outputText>
Но мне повезло и я наткнулся на такую страницу в поиске
https://salesforce.stackexchange.com/que ... g-a-year
Оказывается YYYY это не правильно, а надо yyyy. Хотя с YYYY все работает для других дат, и никаких ошибок или предупреждений не замечал.
Так что поищите в своих проектах, может и у вас где закрался этот баг.
Сегодня столкнулся с любопытной ошибкой которая скрывалась в коде которому уже 100500 лет. 
Клиент написал что в PDF вместо 12/31/2025 видит 12/31/[b]2026[/b] хотя в записи дата корректная.
Смотрю, а там ломаться вроде нечему. Вот такой код
[code]
<apex:outputText style="white-space: nowrap;" value="{0, date, MM/dd/YYYY}">
     <apex:param value="{!p.paymentDate}" />
</apex:outputText>
[/code]
Но мне повезло и я наткнулся на такую страницу в поиске
https://salesforce.stackexchange.com/questions/200899/date-formatting-12-31-incorrectly-adding-a-year
Оказывается YYYY это не правильно, а надо yyyy. Хотя с YYYY все работает для других дат, и никаких ошибок или предупреждений не замечал.
Так что поищите в своих проектах, может и у вас где закрался этот баг. :smile:
Спросил у всезнающего ChatGPT тот же вопрос.
Он причину не нашел, начал предлагать перегонять дату из Date в Datetime, форматировать в Apex и выводить как текст. Проверять там разное. НО в примерах везде указывал MM/dd/yyyy. То есть причина не найдена, но фактически решение предложено. Если копипастить то ошибка уйдет
Спросил у всезнающего ChatGPT тот же вопрос. 
Он причину не нашел, начал предлагать перегонять дату из Date в Datetime, форматировать в Apex и выводить как текст. Проверять там разное. НО в примерах везде указывал MM/dd/[b]yyyy[/b]. То есть причина не найдена, но фактически решение предложено. Если копипастить то ошибка уйдет :rolling:
Подсказал чату жпт найденное решение и по ходу получил ответ почему так происходит

The accepted answer says that uppercase Y does not mean “calendar year” — it means “week-year” (the ISO/Java notion of a year tied to week-of-year calculations).

As a result, a date of December 31 may get mapped to the next calendar year if that date falls into week 1 of the next “week-year”. In their case "12/31/19" rendered as "12/31/20"
Подсказал чату жпт найденное решение и по ходу получил ответ почему так происходит

The accepted answer says that uppercase Y does not mean “calendar year” — it means “week-year” (the ISO/Java notion of a year tied to week-of-year calculations).

As a result, a date of December 31 may get mapped to the next calendar year if that date falls into week 1 of the next “week-year”. In their case "12/31/19" rendered as "12/31/20"
Dmitry Shnyrev
The accepted answer says that uppercase Y does not mean “calendar year” — it means “week-year” (the ISO/Java notion of a year tied to week-of-year calculations).

интересно.
посмотрел в help.
Y- Week-based year (Example: for December 31, 2019, the output is 2020, as December 31 falls in the first week of 2020.)
https://help.salesforce.com/s/articleVie ... m&type=5

спросил Jarvis (AI assistant) в slack:
- "MM/dd/yyyy": The lowercase "yyyy" represents the calendar year in a standard format. For example, December 31, 2023, would be formatted as "12/31/2023".
- "MM/dd/YYYY": The uppercase "YYYY" represents the ISO week-numbering year. This format aligns the year with the week number of the year. The ISO year may differ from the calendar year, especially for dates at the end of December or the start of January. For example, if December 31 falls in the first week of the following ISO year, "YYYY" would reflect that next year instead of the current calendar year.
[quote="Dmitry Shnyrev"]The accepted answer says that uppercase Y does not mean “calendar year” — it means “week-year” (the ISO/Java notion of a year tied to week-of-year calculations).[/quote]

интересно.
посмотрел в help.
Y- Week-based year (Example: for December 31, 2019, the output is 2020, as December 31 falls in the first week of 2020.)
https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_data_prep_date_format_guidelines.htm&type=5 

спросил Jarvis (AI assistant) в slack: 
- "MM/dd/yyyy": The lowercase "yyyy" represents the calendar year in a standard format. For example, December 31, 2023, would be formatted as "12/31/2023".
- "MM/dd/YYYY": The uppercase "YYYY" represents the ISO week-numbering year. This format aligns the year with the week number of the year. The ISO year may differ from the calendar year, especially for dates at the end of December or the start of January. For example, if December 31 falls in the first week of the following ISO year, "YYYY" would reflect that next year instead of the current calendar year.
Сколько работаю а вот первый раз про это узнал. Вот такая неочевидная разница между YYYY и yyyy а какой может подкинуть гемор. Вообще интересно кто-нибудь пользуется фичей "Week-based year"?
Сколько работаю а вот первый раз про это узнал. Вот такая неочевидная разница между YYYY и yyyy а какой может подкинуть гемор. Вообще интересно кто-нибудь пользуется фичей "Week-based year"?
настоящий праздничный баг - происходит строго под новый год
настоящий праздничный баг - происходит строго под новый год
Den Brown
настоящий праздничный баг

Пасхалка
[quote="Den Brown"]настоящий праздничный баг[/quote]
:rolling::rolling::rolling::rolling::rolling:
Пасхалка :party: