Dates and Calendar nodes
Overview
There are two important ways that Tana treats date information. Date objects are a concept of time that you can link to, meanwhile a calendar node is a place in the graph you can write on that is related to a date. The two are intertwined but not the same.
Date objects can be mentioned on any node using @-mention. They have flexible date granularities so you can be as broad or specific as you want to be, allowing you to say "meet Henry at 2:15pm tomorrow", as well as "yearly goal for 2024".
Calendar nodes are what drive your daily page. They are automatically set up for days, weeks, months, and years, and allow you to take notes and set up searches that capture items in those date intervals.
Basics
Date objects
- Dates in Tana keep everything connected to time in your graph. To reference date objects in Tana, use @ and write out the date/time you want in natural language. Try typing
@today
in Tana, and you'll see it bring up today's date. - Tana has a date field type so you can add date information to any node. You can use just the field under a node, or add them via supertag templates.
- Date objects allow for different date granularities. Try typing
@November
,@Wednesday last week
, or@5pm next Saturday
. Once you have a date object, you can click it to bring up the date picker. - A negative year is parsed as BC/BCE. To know what it is in astronomical years, add one. Example: input "
-101
" = "101 BC
" = "-100
" in astronomical years
Calendar nodes
- Calendar nodes are the day/week/month/year nodes on the root of a workspace. They're automatically generated for your private workspace, and can be generated for other workspaces too. They are connected to the dates they represent, so you can take notes connected to that date granularity, and it also retrieves references based on that.
- The Today page is a calendar node. They exist within week nodes, that exists within year nodes. You can see all the calendar nodes in Tana by going to your Home page and expanding the Calendar.
- The supertag on a calendar node can be customized. Create your own time-based templates for things like reviews, reminders, and logs. You don't need a supertag on your calendar nodes (they function just as well without them) but they're handy for making daily/weekly/monthly/yearly templates. Use the command "
create default day/week/month/year tag
" on the calendar node to create them.
- Tana has Month nodes. Months do not appear as nodes under the Calendar node like Week/Day do, so you must navigate to months via the Today page, or from a date object with month granularity.
- Use search nodes with field values PARENT/GRANDPARENT on any calendar node. This allows you to retrieve all nodes within a time span ie. a PARENT search on month will find all nodes with a specific date within that month
Documentation
Date objects
To add a date on a node
- Using mouse: On an empty node, press the placeholder node (+) > Insert date
- Using keyboard: Type @ and write out the date or in natural language what you want. Examples: "
today at 5pm
", "Nov 15
", "yesterday
", "last month
", "in two weeks
".
To add a date in a date field
- To create a date field, see Date fields
- Date fields show a small calendar icon on the right.
- On an empty field, press the small calendar icon to the right, or hit space to insert today's date and bring up the date picker.
To open the date picker
- Using mouse: On any date object, click on it, or right-click > Show Calendar
- Using keyboard: Select the date object and hit Enter
To change an existing date/time and granularity
- Via date picker: Click on the date object to bring up the date picker and click on a date to change it. For larger granularity, clear the selected date options by pressing the (x) in the corners. For smaller granularity select/input the finer granularity you want.
- Change granularity: Arrow keys + Spacebar to add/change/remove granularities. Hit Enter/Esc to commit the changes.
- Week granularity: Select a week as a date by clicking on the weeks to the left.
- Using keyboard shortcuts on a selected date object: When a date object is selected, you can use these shortcuts to quickly change date and time:
- Go forward in time = key, Go back in time = Shift+key
- Keys
- 5 minutes: J
- 1 hour: H
- 1 day: D
- 1 week: W
- 1 month: M
- 1 quarter: Q
- 1 year: Y
- Increment by one granularity: +/- keys.
- Using command line on a selected date object: Run command line (Cmd/Ctrl+K) > Change date.
- This command gives you the following options:
- Switch granularities (day/week/month/year)
- Add/remove time
- Next minute/5min/hour/day/week/month/quarter/year
- Previous minute/5min/hour/day/week/month/quarter/year
- Change increment/decrement
- This command gives you the following options:
To make a date range
- In the date picker: add an end date using
add end
. Useremove end
to remove the range. - In @-mention: Write
@[date] to [date]
. Example:@Nov 21 to Nov 30
- In command node: see Insert relative date
Calendar nodes
To reach your private day node/Today
- Using mouse: Use the Today button on the sidebar, or the Today button on every calendar node
- Using keyboard: Ctrl+Shift+D
- In the sidebar, Alt+click on your private workspace header, or expand the workspace and click on the calendar node.
To reach the day node of another workspace
- In the sidebar, Alt+click on the workspace header, or expand the workspace and click on the calendar node.
- In your private day node, use the dropdown
Switch calendars
To go to the calendar node from any date object
Alt
+click the date object to navigate to that corresponding calendar node- Right-click >
Go to calendar date node
/Open calendar date node in new panel
To go to calendar nodes of higher level of granularity than the day node
- From a date object: If the date object references a higher level date granularity like
Week 45
, orNovember 2023
, you canAlt
+click to navigate to that corresponding calendar node - From a day node: The breadcrumbs at the top of calendar nodes show the different granularities. You can click to navigate to them.
✨NEW
You can also right-click the Today button under the title to navigate to this week/month/year.
To traverse between previous/next calendar node
- Using mouse: use the < / > buttons right under the node title
- Using keyboard: use Ctrl+[ / ] to traverse to past/future calendar nodes of that granularity.
To create calendar nodes for other workspaces
- Unlike your private workspace, new workspaces do not come with default calendar nodes.
- To create them, go to any existing calendar node like any one in you private workspace, then
change workspace
to a different one. - To add default tags, right-click on any calendar node or click on the ellipsis button to the right to "
create default day/week/month/year tag
".
The reference section in calendar nodes
At the bottom of each node is a reference section. For calendar nodes, it will collect all nodes in the workspace that mention that particular date granularity, either mentioned in name or in a field. Example: week nodes will capture any node that have date objects using the Week WW
granularity, month nodes will capture November YYYY
granularity and so on.
Linking to calendar nodes
Date searches
There are many search operators that are specifically designed to handle date queries, as well as general purpose numeric ones that work with date queries as well.
Search operators
LT/GT
LT/GT is the only field operator in this list. Find nodes with date that are Less Than/Greater Than a particular date. Less = earlier, greater = later.
To use LT/GT, insert a date field and the value to compare to. Example: To find all appointments you've had up until a certain date, you can build a search like this:
>LT: >Appt date: [Date object]
If the value you access through PARENT
or PARENT.field
is a date value, you can increment/decrement it using +/-. For example, to find all the tasks due during the next three days on a daily node, write a search like this:
>GT: >Due Date: PARENT
>LT: >Due Date: PARENT+3
Date object as string match
Use a date object to find any node that mentions that date as a date object.
FOR DATE YYYY-MM-DD
A keyword operator that matches any node that mentions that date as a date object.
Insert a date in the YYYY-MM-DD format, like this: FOR DATE 2023-11-21
IS CALENDAR NODE
A keyword operator that matches with calendar nodes.
Is most useful for excluding from searches:
>NOT: IS CALENDAR NODE
ON DAY NODE
A keyword operator that matches children of any #day node
...(NUMBER) DAYS
Several search operators will look for nodes with date values within (NUMBER) of days:
DONE LAST (N) DAYS
CREATED LAST (N) DAYS
EDITED LAST (N) DAYS
OVERDUE
+ "Due date" field (legacy)
The search operator OVERDUE only works when used in tandem with system field Due date.
We discourage using Due date because system fields in general are very inflexible. They cannot be configured and customized like other user-created fields with default hide state, default value, auto-initialization and so on.
We can now replicate the functionality of OVERDUE for any date field using LT/GT.
For more date-related searches, check this FAQ out.
Field values
PARENT/GRANDPARENT
PARENT
/GRANDPARENT
refers to the immediate ancestors in the outline hierarchy relative to the search node.
If the parent/grandparent is a calendar node, you can add these search operators as a date field value. This will replace the field value with the date represented by the calendar node.
Example: If you create search nodes on your day node, you can use PARENT/GRANDPARENT to fetch all #tasks that are due today (PARENT), or this week (GRANDPARENT)
You can use PARENT+3
/PARENT-3
to find future/past dates relative to the target. See LT/GT for more.
If a node has a date field, you can use PARENT.field to target that field value for date searches. See LT/GT for more.
FOR RELATIVE DATE [term]
Add this in the date field value, and it will be replaced with a date that is relative to the current date.
Compare PARENT/GRANDPARENT with FOR RELATIVE DATE, the former let's you look back at what you wrote yesterday relative to the calendar node you're on, whereas the latter shows results relative to today's values (which will change every day), and can be placed anywhere in the graph (not just nested as a child/grandchild of a calendar node).
- Present time: Today, this week, this month, this year
- Past: Yesterday, last week, last month, last year
- Future: Tomorrow, next week, next month, next year
Command nodes with date function
Insert relative date
Accepts the following parameters
- Relative date string (required)
- Reference date
- Date/time granularity
- Set only start or end of date
- Target node
Suggested uses:
- time tracking setups (set present date/time)
- scheduling commands (postpone start date by +5 days)
- extract start and end of a ranged date object into two separate fields
- combine two separate fields (for example from imported data) into a ranged date object
Unfortunately we don't have a search expression that can be used in a node filter for dates that have a start/end or not.
See Command nodes > Insert relative date for more.
Auto-initialization of date fields
Date fields used in supertags can be made to auto-populate a date upon use. Use a date field in the supertag config, and the following auto-initialize options will be available:
- to current date: inserts today's date
- to date of ancestor day node: inserts the date of an ancestor journal node
- to value from ancestor with this field: Get the field value from an identical field on a node nested above. For example you could have a #quote tag with an Author field, and it could automatically initialize with the value from the Author field of the #book that it is nested underneath
Default date/time system fields
Every node stores a some default system fields that record date/time information based on certain events. This information are not editable, but can be queried.
- Created time: Date/time a node was created
- Last modified time: Date/time a node was last edited
- Done time: Date/time a node was registered "done". Has to be manual toggle, doesn't work with done state mapping/kanban-style setups.
- Date from calendar node: Calendar node that a node is a descendant of.
Date/Time settings
Time zones
- Tana has a bare-bones implementation of time zones, which was necessary because when people are collaborating in Tana across timezones and search for "what happened today", they're not interested in only what happened "today" in their own time zone, they want to know what happened in "today"s everywhere, possibly in every timezone.
- Timezones are set per workspace, stored in Settings.
- Timezones uses the tz format. It can be changed manually by using one of the names from this list (use larger cities just to be sure): https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Time format
- Time format settings are per user, stored in Settings
- Dictates how Tana displays time. Choose between:
- 12H
- 24H
- Auto (based on your local settings)
First day of the week
- First day of the week setting are per user, stored in Settings
- Allows you to choose whether to start your week on Sunday or Monday.
- Currently the daily nodes in the calendar hierarchy are all organized starting Monday though, this only affects what you see in the various date pickers and in the calendar view.
- You can also set this using command line > Set start of week to...
The calendar view
See any list of nodes plotted in a calendar.
- By default you can use their system fields "Created at"/"Edited at", or "Done time" if it has checked status.
- Otherwise you can use any date field on the node that you have created (like Due date, Launch date, Publish date etc).
- Choose to plot nodes using one or more specific fields with date values.
For more, see Views > Table view
Examples
See all captured items from a day/week/month
Create a search node under a day/week/month to see all captured items from that period.
- Grab a reference to the Inbox and paste in the query builder
- Add the system field Created date and make the field value PARENT
- Your search node should look like this:
- Inbox (reference)
- >Created date::PARENT
Related release notes
- fixedWe fixed a bug where Previous/Next on calendar nodes always took you to a day node (even if you were on a week/month/year node) ()
- improvedLINKS_TO search expression clause should now work on calendar nodes by treating it as a date. Talk about being friend-zoned... ()
- fixedWe changed something, then some users said using Tab for inserting dates doesn't work anymore, so using Tab to insert your @-mention selection works (again?). Now, the question is: who picks up the Tab on the second date? ()
- improvedClicking a date field now opens the date picker automatically ()
Related FAQs
- Can you have a different supertag applied to your day nodes based on a specific interval?
Background
Recently the community discovered a peculiar thing was possible with regards to Calendar/Journal nodes. It was code that was put in a while back when we were thinking about how to revamp the calendar nodes, a project we had to shelf for other priorities. It was code that is the wee beginnings of how to do recurring calendar node templates.
In the Journal node section of your settings, you'll see this:
There's an expression you can use to define intervals of when you want certain supertags applied to certain calendar nodes. It is loosely based on the cron format (opens Wikipedia)
In the field values for defining which supertag to use, you can nest the tags under a cron expression to have it apply only during a certain interval The expression takes on this custom format:
DAY-OF-MONTH
MONTH
DAY-OF-WEEK
YEAR
Legend: Cron format
DAY-OF-MONTH
1-31
MONTH
1-12
, orJAN-DEC
DAY-OF-WEEK
MON-SUN
, or1-7
YEAR
2024
Common syntax in cron
*
(asterisk) represents "every" possible value for that field.?
(question mark) is used to specify "no specific value" and is often used where the day of the month or day of the week should be ignored.,
(comma) is used to separate discreet values
How to use in Tana
Specify the cron expression as a field value, and nest the supertag you want used at that interval.
Here are some pattern examples from u/syncretizm on Reddit
Specific day of the week:
? * FRI *
= Every Friday
Only weekdays:
? * MON-FRI *
= Every weekday
Specific date in a month every year:
31 12 * *
= Last day of the year
Last day of any month:
L * ? *
= Last day of the month
Every day in a specified month:
* 3 * *
= Every day in March
Here are even more patterns, courtesy of GPT
A specific day of every month:
15 * * *
= The 15th day of every month.
Specific days of the week throughout the year:
* * MON,WED,FRI *
= Every Monday, Wednesday, and Friday of every week.
First day of each quarter:
1 1,4,7,10 * *
= January 1, April 1, July 1, and October 1.
Last weekday of a specific month:
LW * SEP *
= Last weekday of September.
Specific day of the week in a specific month:
* 11 FRI *
= Every Friday in November.
A day near the end of the month, every month:
L-3 * * *
= The third-to-last day of every month.
An annual event on a specific day and month:
14 2 * *
= Every February 14th.
First Monday of every month:
1-7 * MON *
= The first Monday that occurs between the 1st and 7th of every month.
Specific day of the week, only in certain months:
* JAN,MAR,JUL FRI *
= Every Friday in January, March, and July.
A specific day if it is a weekday:
5 * MON-FRI *
= The 5th of the month if it is a weekday.
Skipping years for an annual event:
10 10 * * 2023/2
= October 10th, starting in 2023 and every two years thereafter.
Note that it will only apply to all new day nodes once the rule is established. It will not apply to existing nodes.
Related docs:
- How can I extract the start date of a range using Commands?
Use
Insert relative date
command, here's an example:Related docs:
- How can I retrieve tasks dated for today?
On the daily page (or any calendar node)
- Create a search that uses
PARENT
in the field value of the Date field of the task. - With
PARENT
/GRANDPARENT
in a date field:- you can append with
-3
or+3
(use any number) to hit a specific date before/after thePARENT
date, respectively. Example:PARENT+3
= Any match on date 3 days from today
- You can use
GT
/LT
search operators (greater than or less than) together withPARENT
to match a range of dates before/after today. Example:>GT
:PARENT-3
>LT
:PARENT
- = Any match between today and three days ago.
- you can append with
If not on a day node
- Use
FOR RELATIVE DATE [term]
as keyword field value for the Date field of the task, and inserttoday
as the term, without the brackets.
Related docs:
- Create a search that uses
- I have dates written as text, how can I convert them to Tana dates?
Typically, to insert a date into a node
- Type @ followed by the date expression: today, tomorrow, friday, last monday
- Tana understands natural language for dates, so you can say "in two weeks" and Tana will understand
If you want to convert text to a Tana date object
- Select text that contains the date
- Press the @ key
- Select desired option
Source of FAQ: Tana Community Resource Hub
Related docs:
- I need help with date search! How do I do X?
It depends on what you want to find, the context of the search (which part of the graph it is made in), and the time scale/granularity you are looking for.
Below are possible queries you can use to find date-related things in Tana. A quick legend:
> : Typing this key starts a field anywhere in Tana, so we prefix fields with this sign when writing out queries in textLT/GT : Less than/Greater than field operators
text
: Text in this style is meant to be written outI want to find all overdue items from a deadline date field...
- based on what the time is right now (most efficient graph-wise):
- >LT : >your deadline field :
FOR RELATIVE DATE today
- Example: You are making a task dashboard in the tree that is always showing you information based on the current time
- >LT : >your deadline field :
- based on the date in a date field of parent node:
- >LT : >your deadline field :
PARENT.date field
- Example: You can see overdue tasks based on the date of the meeting note
- >LT : >your deadline field :
- based on the date of an ancestor calendar node:
- >LT : >your deadline field :
PARENT
/GRANDPARENT
- Example: You have a search node as part of your #day supertag template
- >LT : >your deadline field :
I want to find deadline dates that fall within a range (let's say, a week)...
- based on what the time is right now, and this/last/next week/month/year:
- >your deadline field :
FOR RELATIVE DATE this/last/next week
- >your deadline field :
- relative to a date field of the parent node:
- >LT : >your deadline field :
PARENT.date field
- >GT : >your deadline field :
PARENT.date field-7
- >LT : >your deadline field :
- relative to the date of a calendar node:
- >LT : >your deadline field :
PARENT
- >GT : >your deadline field :
PARENT-7
- >LT : >your deadline field :
I want to find nodes based on their location in the journal nodes...
- To pick up the date based on the calendar node they are nested under, use system field Date from calendar node
- For field value, use any variation from the above examples depending on need and context
I want to find nodes relative to the search node's location in a journal node...
- Relative to parent
PARENTS DESCENDANTS
- Example: A search node on a day page limits search to only nodes that live on the parent Day page
- Relative to grandparent
GRANDPARENTS DESCENDANTS
- Example: A search node on the day page limits search to only nodes that live on the grandparent Week page
- For both operators, add
WITH REFS
to include references in the search
I want to find nodes based on when they were created/edited/done relative to now (replace
X
with a number)CREATED LAST X DAYS
EDITED LAST X DAYS
DONE LAST X DAYS
I want to find nodes based on when they were created/edited/done relative to a date field of the parent node
- Use system fields Created time, Last edited time, and Done time
- As field value, write out
PARENT.date field
To read about these search operators and more, check out Search Operators
Related docs:
- based on what the time is right now (most efficient graph-wise):
- Should I use the DUE DATE field?
TL;DR: No, create your own date fields.
Background: Early on in Tana's history the team wanted a way to find overdue tasks but there was no current way of searching for nodes with dates relative to a certain date. So, the system field "Due Date" along with the search operator OVERDUE was created specifically this reason.
But since the introduction of LT / GT (less than/greater than) operators, there is no reason to use the system Due Date field, along with the OVERDUE search operator.
A user defined field for Date or Due Date offers more flexibility:
- You can use initialize feature if desired
- Consistent color with other fields
- You can hide the field
Example of a query to find nodes with a date that is past a certain time:
Source of FAQ: Tana Community Resource Hub
Related docs:
- The calendar nodes I made in other workspaces doesn't have the default tags. How do I make them?
Calendar nodes don't need the day/week/month/year supertags to work, so they come by default without them. It's only necessary to add supertags if you want to use templates for gathering tasks or doing reviews for that time granularity. To add default tags, right-click on any calendar node to "create default day/week/month/year tag". Once it's created, you can rename and customize it like any other supertag.
For more detail, check out the documentation on the Dates and Calendar nodes page.
Related docs: