Insert timestamps and cross-link your daily notes with the flexibility of natural language. NLDates provides a suite of tools that makes working with dates and times within Obsidian frictionless.
If a date is not recognized, the link won't be created.
Expand dates using natural language inline within the editor view.
Typing @today
Enter will automatically be expanded to the current date. Press Shift at the same time to keep the input text as an alias (e.g. @today
→ [[202112-27|today]]
).
Setting | Description | Default |
---|---|---|
Enable/Disable | A global toggle to enable or disable the autosuggest | Enabled |
Trigger phrase | Character(s) required to open the autosuggest | @ |
Insert as link? | Dates will be inserted as wikilinks (i.e. [[<date>]] ) |
Yes |
nldates
URI ActionIt's now possible to use the Obsidian URI to open daily notes using natural language by using the nldates action obsidian://nldates?day=<date here>
. Don't forget to encode space characters appropriately.
obsidian://nldates Parameter |
Description |
---|---|
day |
natural language date string |
newPane |
open note in new pane, default is yes |
nldates
adds a few commands to work with dates in natural language. You can add custom hotkeys for them by going to Settings > Hotkeys
and filtering by Natural Language Dates
(Note that hotkeys are unset by default starting on v0.4.1).
Opens the date picker menu
Setting | Description | Default |
---|---|---|
Insert current date | Inserts the current date, using the format specified in the settings menu | YYYY-MM-DD |
Insert current time | Inserts the current time, using the format specified in the settings menu | HH:mm |
Insert current date and time | Inserts the current date, using the format specified in the settings menu | YYYY-MM-DD HH:mm |
Parse natural language date | Parses the selected text as a natural language date. Replaces selected text with an obsidian link to the parsed date in the format specified in the settings menu. For single-word dates (e.g. today, tomorrow, friday, etc.), it's possible to use the command without selecting the word first. It's also possible to use dates like Nov9, 25Dec to use this trick. |
[[YYYY-MM-DD]] |
Parse natural language time | Parses the selected text as a natural language time. Replaces selected text with the parsed time stamp in the format specified in the settings menu. You can try with any of the standard times, i.e. now, in 15min, in 1h, 5min ago, etc. | HH:mm |
Parse natural language date (as link) | Parses the selected text as a natural language date. Replaces selected text with a standard markdown link to the parsed date in the format specified in the settings menu | [selected text](YYYY-MM-DD) |
Parse natural language date (as plain text) | Parses the selected text as a natural language date. Replaces selected text with a plain text parsed date in the format specified in the settings menu | YYYY-MM-DD |
Note: You can of course add hotkeys to each of these commands.
The parser supports most date/time formats, including:
Note: The parser will replace all the selected text, meaning that in a sentence you should only select the dates to be parsed and not the full sentence.
In the example sentenceDo this thing by tomorrow
, only the wordtomorrow
should be selected. Alternatively, keep in mind that you can place your cursor on or next to the word tomorrow, and it will be replaced:
In Obsidian go to Settings > Third-party plugins > Community Plugins > Browse
and search for Natural Language Dates
.
Unzip the latest release into your <vault>/.obsidian/plugins/
folder.
Powered by the chrono library and some custom parsing.
The only behaviours I changed were the following:
Write | Date |
---|---|
next week | next Monday |
next [month] | 1st of next month |
mid [month] | 15th of the month |
end of [month] | last day of the month |
NLDates provides an interface for you to parse natural language dates in your plugin. The parsedDate()
function is available on the NaturalLanguageDates plugin instance. It has the following signature:
interface NLDResult {
formattedString: string;
date: Date;
moment: Moment;
}
function parseDate(date: string): NLDResult;
formattedString
will return the date formatted according to the settings of nldates
and without the square brackets.date
object is what is returned by the parseDate
method of the custom parser (using the chrono package).moment
object is created with the date
object.const nldatesPlugin = obsidianApp.plugins.getPlugin("nldates-obsidian");
const parsedResult = nldatesPlugin.parseDate("next year");
console.log(parsedResult.moment.format("YYYY")); // This should return 2021
Input | Example | Description |
---|---|---|
YYYY |
2014 |
4 or 2 digit year. Note: Only 4 digit can be parsed on strict mode |
YY |
14 |
2 digit year |
Y |
-25 |
Year with any number of digits and sign |
Q |
1..4 |
Quarter of year. Sets month to first month in quarter. |
M MM |
1..12 |
Month number |
MMM MMMM |
Jan..December |
Month name in locale set by moment.locale() |
D DD |
1..31 |
Day of month |
Do |
1st..31st |
Day of month with ordinal |
DDD DDDD |
1..365 |
Day of year |
X |
1410715640.579 |
Unix timestamp |
x |
1410715640579 |
Unix ms timestamp |
gggg |
2014 |
Locale 4 digit week year |
gg |
14 |
Locale 2 digit week year |
w ww |
1..53 |
Locale week of year |
e |
0..6 |
Locale day of week |
ddd dddd |
Mon...Sunday |
Day name in locale set by moment.locale() |
GGGG |
2014 |
ISO 4 digit week year |
GG |
14 |
ISO 2 digit week year |
W WW |
1..53 |
ISO week of year |
E |
1..7 |
ISO day of week |
For further information, see: moment.js docs.
moment
instanceIf you need, you can further manipulate or format the moment object, for example:
const nldatesPlugin = obsidianApp.plugins.getPlugin("nldates-obsidian");
const nextYear = nldatesPlugin.parseDate("next year");
console.log(nextYear.moment.format("YYYY")); // This should return 2021
console.log(nextYear.moment.fromNow()); // "In two months"
const thisEvening = nldatesPlugin.parseDate("today at 21:00");
console.log(thisEvening.moment.add(1, "hour")); // This would change the Moment to 22:00
Note that if you manipulate the parsedResult.moment
, the date
and formattedString
won't be updated. If you don't want to alter the parsedResult.moment
, you should clone it. Read more about that on the moment.js docs site.