You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Igor Rodchenkov (Jira)" <ji...@apache.org> on 2025/10/23 13:49:00 UTC

[jira] [Created] (LANG-1791) FastDateFormat behavior changed between 3.0.1 and e.g. 3.18.0 and later

Igor Rodchenkov created LANG-1791:
-------------------------------------

             Summary: FastDateFormat behavior changed between 3.0.1 and e.g. 3.18.0 and later
                 Key: LANG-1791
                 URL: https://issues.apache.org/jira/browse/LANG-1791
             Project: Commons Lang
          Issue Type: Bug
         Environment: Linux (Ubuntu 24.04), temurin-17.0.16 JDK, run in Toronto.
            Reporter: Igor Rodchenkov


Lately, we discovered a bug which is better demonstrate with this test case (it's not perfect  because always passes in GMT zone, but e.g. in Toronto it passes when commons-lang3 v3.0.1 used and fails when v3.18.0 or 3.19.0 is used; and yes, in this special case, we have somewhat legacy java code using Calendar etc., but that was what broke in our app by this library upgrade, which supoosed to be backward compatible):

 

 
{code:java}
/*
* org.apache.commons.lang3.time.FastDateFormat
* In dateFormatter.format(timeCal), when time was not set explicitly, would make e.g.
*   the following timestamps in Toronto at 10 am on 2025-09-17:
*   "2025091714" - UTC, as expected, when using commons-lang3 v3.0.1
*   "2025091710" - EDT, when using commons-lang3 v3.18.0 :(
*/
@Test
public void fastDateFormatFormatterUsingCalendarShouldMakeGmtTimestamp() {
    FastDateFormat dateFormatter = FastDateFormat.getInstance("yyyyMMddHH");
    TimeZone timeZone = TimeZone.getTimeZone("GMT");
    Calendar timeCal = Calendar.getInstance(timeZone);
    Date time1 = timeCal.getTime(); //in local time zone
    ZoneId zone = ZoneId.systemDefault();
    ZoneOffset off = zone.getRules().getOffset(time1.toInstant());
    System.out.printf("Time: %s, zone: %s, offset(s): %s\n", time1, zone, off.getTotalSeconds());
    String timestamp1 = dateFormatter.format(timeCal); //makes local zone timestamp when commons-lang3 v3.18.0 is used.
    Date time = Date.from(Instant.now().minusSeconds(off.getTotalSeconds()));
    String timestamp2 = dateFormatter.format(time); //GMT timestamp
    assertEquals(timestamp2, timestamp1);
}{code}
 

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)