Format durations and local/zoned date-times via PlaceholderAPI
%dtf_duration_<duration>_<format>%
%dtf_local_<adjuster>_<time>_<format>_[locale]%
%dtf_zoned_<adjuster>_<time>_<zone>_<format>_[locale]%
%dtf_format_<datetime>_<from>_<to>_[from-locale]_[to-locale]_[zone]%
Syntax:
%dtf_duration_<duration>_<format>%
Durations can include chained units:
1h30m→ 1 hour 30 minutes150s→ 150 seconds5m20s15ms→ 5 minutes 20 seconds 15 milliseconds10t→ 10 ticks
Supported units case-insensitive (defaults to ticks):
| Symbol | Meaning |
|---|---|
ms |
Milliseconds |
s |
Seconds |
m |
Minutes |
h |
Hours |
d |
Days |
t |
Ticks |
Format can be provided directly to placeholder:
%dtf_duration_90m_HH:mm:ss%
It can also be provided in PlaceholderAPI config.yml (located at .../plugins/PlaceholderAPI/config.yml):
expansions:
dtf:
example: 'HH:mm:ss'And then addressed by key:
%dtf_duration_90m_example%
There is also a bunch of predefined formats case-sensitive (addressed by key):
| Key | Maps to |
|---|---|
HMS |
01:23:00.000 |
ISO |
P0Y0M0DT1H23M0.000S |
WORDS |
0 days 1 hour 23 minutes 0 seconds |
WORDSL |
1 hours 23 minutess 0 seconds |
WORDST |
0 days 1 hour 23 minutes |
WORDSLT, WORDSTL |
1 hour 23 minutes |
Format is applied using Apache DurationFormatUtils
Syntax:
%dtf_local_<adjuster>_<time>_<format>_[locale]%
Shift the current LocalDateTime.now() before formatting.
You can adjust using durations (can be negative) or predefined adjusters case-insensitive:
Predefined adjusters
| Key | Maps to |
|---|---|
NOW |
No adjustment — returns the current datetime |
PREVIOUS-MONDAY |
Move to previous Monday |
PREVIOUS-TUESDAY |
Move to previous Tuesday |
PREVIOUS-WEDNESDAY |
Move to previous Wednesday |
PREVIOUS-THURSDAY |
Move to previous Thursday |
PREVIOUS-FRIDAY |
Move to previous Friday |
PREVIOUS-SATURDAY |
Move to previous Saturday |
PREVIOUS-SUNDAY |
Move to previous Sunday |
PREVIOUS-OR-SAME-MONDAY |
Previous Monday, or today if Monday |
PREVIOUS-OR-SAME-TUESDAY |
Previous Tuesday, or today if Tuesday |
PREVIOUS-OR-SAME-WEDNESDAY |
Previous Wednesday, or today if Wednesday |
PREVIOUS-OR-SAME-THURSDAY |
Previous Thursday, or today if Thursday |
PREVIOUS-OR-SAME-FRIDAY |
Previous Friday, or today if Friday |
PREVIOUS-OR-SAME-SATURDAY |
Previous Saturday, or today if Saturday |
PREVIOUS-OR-SAME-SUNDAY |
Previous Sunday, or today if Sunday |
NEXT-MONDAY |
Move to next Monday |
NEXT-TUESDAY |
Move to next Tuesday |
NEXT-WEDNESDAY |
Move to next Wednesday |
NEXT-THURSDAY |
Move to next Thursday |
NEXT-FRIDAY |
Move to next Friday |
NEXT-SATURDAY |
Move to next Saturday |
NEXT-SUNDAY |
Move to next Sunday |
NEXT-OR-SAME-MONDAY |
Next Monday, or today if Monday |
NEXT-OR-SAME-TUESDAY |
Next Tuesday, or today if Tuesday |
NEXT-OR-SAME-WEDNESDAY |
Next Wednesday, or today if Wednesday |
NEXT-OR-SAME-THURSDAY |
Next Thursday, or today if Thursday |
NEXT-OR-SAME-FRIDAY |
Next Friday, or today if Friday |
NEXT-OR-SAME-SATURDAY |
Next Saturday, or today if Saturday |
NEXT-OR-SAME-SUNDAY |
Next Sunday, or today if Sunday |
MONDAY |
Set date to Monday of the current week |
TUESDAY |
Set date to Tuesday of the current week |
WEDNESDAY |
Set date to Wednesday of the current week |
THURSDAY |
Set date to Thursday of the current week |
FRIDAY |
Set date to Friday of the current week |
SATURDAY |
Set date to Saturday of the current week |
SUNDAY |
Set date to Sunday of the current week |
MONTH |
First day of the current month |
NEXT-MONTH |
First day of next month |
YEAR |
First day of the current year |
NEXT_YEAR |
First day of next year |
Sets time.
Use either case-insensitive:
NOW→ keep system timeHH:mm:ss→ override time (parsed usingLocalTime.parse(CharSequence text))
Examples:
%dtf_local_NEXT-MONDAY_15:00_ISO-LOCAL-DATE%
→ Returns next Monday at 15:00 as ISO date.
%dtf_local_-30m_NOW_ISO-DATE-TIME%
→ Returns current time minus 30 minutes as ISO date-time.
Format is parsed as described in DateTimeFormatter, there is also a bunch of predefined formats case-sensitive:
| Key | Maps to |
|---|---|
BASIC-ISO-DATE |
yyyyMMdd |
ISO-LOCAL-DATE |
yyyy-MM-dd |
ISO-DATE |
yyyy-MM-dd |
ISO-LOCAL-TIME |
HH:mm:ss.SSS |
ISO-TIME |
HH:mm:ss.SSS |
ISO-LOCAL-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS |
ISO-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS |
ISO-ORDINAL-DATE |
yyyy-D |
ISO-WEEK-DATE |
yyyy-Ww-e |
You can also specify optional formatter locale as IETF BCP 47 language tag (parsed using Locale.forLanguageTag(String languageTag), defaults to Locale.getDefault())
NOW or blank → uses Locale.getDefault()
Syntax:
%dtf_zoned_<adjuster>_<time>_<zone>_<format>_[locale]%
Sets the current ZonedDayTime.now(ZoneId zone) to provided zone id.
Zone id is defined as described in https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html
SHORT_IDS are valid as well. Examples:
NOW→ uses system default timezoneUTCGMT+5America/New_YorkEurope/BerlinCET,EST, etc.
Format is parsed as described in Local DateTime Formatting, but predefined formatters are different case-sensitive:
| Key | Maps to |
|---|---|
BASIC-ISO-DATE |
yyyyMMdd+HHmmss |
ISO-LOCAL-DATE |
yyyy-MM-dd |
ISO-OFFSET-DATE |
yyyy-MM-dd+HH:mm:ss |
ISO-DATE |
yyyy-MM-dd+HH:mm:ss |
ISO-LOCAL-TIME |
HH:mm:ss.SSS |
ISO-OFFSET-TIME |
HH:mm:ss.SSS+HH:mm:ss |
ISO-TIME |
HH:mm:ss.SSS+HH:mm:ss |
ISO-LOCAL-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS |
ISO-OFFSET-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS+HH:mm:ss |
ISO-ZONED-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS+HH:mm:ss[ZoneId/ZoneOffset] |
ISO-DATE-TIME |
yyyy-MM-ddTHH:mm:ss.SSS+HH:mm:ss[ZoneId/ZoneOffset] |
ISO-ORDINAL-DATE |
yyyy-D+HH:mm:ss |
ISO-WEEK-DATE |
yyyy-Ww-e |
ISO-INSTANT |
yyyy-MM-ddTHH:mm:ss.SSSZ |
RFC-1123-DATE-TIME |
EEE, dd MMM yyyy HH:mm:ss ZoneId/ZoneOffset |
You can also reformat local and zoned date-times.
Syntax:
%dtf_format_<datetime>_<from>_<to>_[from-locale]_[to-locale]_[zone]%
Expects a date-time string such as:
- Mon, 8 Dec 2025 23:01:16 +0500
- 2025-12-08T22:04:06.034735454+04:00[Asia/Yerevan]
- 2025-12-08
- 22:04:26.733221114
- 8-Dec-2025
Expects a format matching provided date-time, for example:
- Mon, 8 Dec 2025 23:01:16 +0500 →
RFC-1123-DATE-TIME - 2025-12-08T22:04:06.034735454+04:00[Asia/Yerevan] →
ISO-DATE-TIME - 2025-12-08 →
ISO-LOCAL-DATE - 22:04:26.733221114 →
ISO-LOCAL-TIME - 8-Dec-2025 →
d-MMM-yyyy
Here you can specify any format as described in Zoned DateTime Format
Expects a locale matching provided date-time locale (defaults to Locale.getDefault()).
Overrides date-time locale (defaults to Locale.getDefault()).
Overrides time zone (keeps original time zone if not specified).
- Before formatting anything dtf will set Bracket placeholders inside itself, that way you can provide data from other placeholders.
%dtf_duration_5m30s_HMS%→ 0:05:30.000%dtf_local_NEXT-MONDAY_NOW_ISO-LOCAL-DATE%(when 2025.12.08) -> 2025-12-15%dtf_zoned_NOW_NOW_UTC_RFC-1123-DATE-TIME%-> Mon, 8 Dec 2025 09:50:55 GMT%dtf_zoned_NOW_NOW_NOW_d-MMM-yyyy_ja%-> 8-12月-2025%dtf_format_{dtf_zoned_NOW_NOW_NET_ISO-DATE-TIME}_ISO-DATE-TIME_RFC-1123-DATE-TIME_NOW_NOW_GMT+5%(dtf_zoned is used for demonstration purposes) → 2025-12-08T22:27:10.333235773+04:00[Asia/Yerevan] → Mon, 8 Dec 2025 23:27:10 +0500