{"record":{"id":"9aeed2b8e198a063","repo":"languagetool-org/languagetool","slug":"daystr","errorCode":null,"errorMessage":"Редни број дана у недељи за '<dayStr>' не постоји.","messagePattern":"Редни број дана у недељи за '<dayStr>' не постоји\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"languagetool-language-modules/sr/src/main/java/org/languagetool/rules/sr/DateCheckFilter.java","lineNumber":49,"sourceCode":"public class DateCheckFilter extends AbstractDateCheckFilter {\n\n  @Override\n  protected Calendar getCalendar() {\n    return Calendar.getInstance(Locale.forLanguageTag(\"sr\"));\n  }\n\n  @SuppressWarnings(\"ControlFlowStatementWithoutBraces\")\n  @Override\n  protected int getDayOfWeek(String dayStr) {\n    String day = dayStr.toLowerCase();\n    if (day.startsWith(\"по\") || day.equals(\"понедељак\")) return Calendar.MONDAY;\n    if (day.startsWith(\"ут\")) return Calendar.TUESDAY;\n    if (day.startsWith(\"ср\")) return Calendar.WEDNESDAY;\n    if (day.startsWith(\"че\") || day.equals(\"четвртак\")) return Calendar.THURSDAY;\n    if (day.startsWith(\"пе\") || day.equals(\"петак\")) return Calendar.FRIDAY;\n    if (day.startsWith(\"су\") || day.equals(\"субота\")) return Calendar.SATURDAY;\n    if (day.startsWith(\"не\") || day.equals(\"недеља\")) return Calendar.SUNDAY;\n    throw new RuntimeException(\"Редни број дана у недељи за '\" + dayStr + \"' не постоји.\");\n  }\n\n  @Override\n  protected String getDayOfWeek(Calendar date) {\n    return date.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.forLanguageTag(\"sr\"));\n  }\n\n  @SuppressWarnings({\"ControlFlowStatementWithoutBraces\", \"MagicNumber\"})\n  @Override\n  protected int getMonth(String monthStr) {\n    String mon = monthStr.toLowerCase();\n    if (mon.equals(\"јануар\") || monthStr.equals(\"I\") || mon.equals(\"јануара\") || mon.equals(\"јан\")) return 1;\n    if (mon.equals(\"фебруар\") || monthStr.equals(\"II\") || mon.equals(\"фебруара\") || mon.equals(\"феб\")) return 2;\n    if (mon.equals(\"март\") || monthStr.equals(\"III\") || mon.equals(\"марта\") || mon.equals(\"мар\")) return 3;\n    if (mon.equals(\"април\") || monthStr.equals(\"IV\") || mon.equals(\"априла\") || mon.equals(\"апр\")) return 4;\n    if (mon.equals(\"мај\") || monthStr.equals(\"V\") || mon.equals(\"маја\")) return 5;\n    if (mon.equals(\"јун\") || monthStr.equals(\"VI\") || mon.equals(\"јуна\") || mon.equals(\"јун\")) return 6;\n    if (mon.equals(\"јул\") || monthStr.equals(\"VII\") || mon.equals(\"јула\") || mon.equals(\"јул\")) return 7;","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-language-modules/sr/src/main/java/org/languagetool/rules/sr/DateCheckFilter.java#L31-L67","documentation":"DateCheckFilter for Serbian maps a day-of-week token (Serbian Cyrillic/Latin day names or abbreviations) to a java.util.Calendar constant. If the token matches none of the recognized prefixes/full names, getDayOfWeek throws this RuntimeException indicating the day string is not a recognized Serbian weekday.","triggerScenarios":"Passing a day string like 'пн', 'mon', a misspelled weekday, or an inflected form (e.g. 'уторком') that does not start with any recognized prefix ('ут', 'ср', 'че', 'пе', 'су', 'не') into getDayOfWeek via a date-matching rule.","commonSituations":"Grammar rules matching date expressions that include locative/instrumental day forms; locale changes producing Latin-script output while the filter expects Cyrillic (or vice versa); typos in custom rule XML tokens.","solutions":["Check the exact day string reaching the filter — it must start with ут/ср/че/пе/су/не (or equal a known full name).","Normalize case and trim whitespace before the filter processes the token.","If handling inflected day forms, extend the prefix/full-name checks in DateCheckFilter.getDayOfWeek.","Ensure the rule/regex produces the nominative day form the filter expects."],"exampleFix":"// before: unrecognized form thrown at runtime\nthrow new RuntimeException(\"Редни број дана у недељи за '\" + dayStr + \"' не постоји.\");\n// after: normalize and guard in the caller before invoking the filter\nString day = dayStr.trim().toLowerCase(Locale.forLanguageTag(\"sr\"));\nif (!(day.startsWith(\"ут\") || day.startsWith(\"ср\") || day.startsWith(\"че\") ||\n      day.startsWith(\"пе\") || day.startsWith(\"су\") || day.startsWith(\"не\"))) {\n  throw new IllegalArgumentException(\"Unrecognized Serbian day of week: \" + dayStr);\n}","handlingStrategy":"validation","validationCode":"private static final List<String> SR_DAY_PREFIXES = List.of(\"ут\",\"ср\",\"че\",\"пе\",\"су\",\"не\");\nboolean isRecognizedSerbianDay(String dayStr) {\n  String d = dayStr == null ? \"\" : dayStr.trim().toLowerCase(Locale.forLanguageTag(\"sr\"));\n  return SR_DAY_PREFIXES.stream().anyMatch(d::startsWith);\n}","typeGuard":null,"tryCatchPattern":"try {\n  int dayOfWeek = filter.getDayOfWeek(dayStr);\n} catch (RuntimeException e) {\n  logger.warn(\"Unrecognized Serbian day token: {}\", dayStr);\n  // skip rule match or treat date as invalid\n}","preventionTips":["Normalize case, trim, and unify script (Cyrillic vs Latin) before calling the filter.","Keep rule regexes anchored to nominative weekday forms.","Add unit tests covering every weekday form your rules can produce."],"tags":["java","serbian","date-parsing","languagetool"],"backgroundTag":"invalid-date-format","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}