Dates and Calendar nodes

Dates in Tana give you the power to connect all your data in relation to time, and to resurface data that is the most important to you now.

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

To make a date range

  • In the date picker: add an end date using add end. Use remove 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, or November 2023, you can Alt+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

  • improvedThe reference section on calendar nodes will now only show exact mentions of that date object. For example: only nodes with week objects will show up on week nodes, which excludes date objects on other scales (year, month or day). Day nodes will capture all mentions of that day, including ones with a time specified. ()
  • improvedThe inline date clause now will also match on nodes that has a matching date in a field, not only when they're inline in the same node ()
  • improvedWe improved the quality of matches you get when you at-mention dates with weekdays (monday, next monday, etc). ()
  • fixedFixed issue with dates being buried in at-mentions. They now appear first when you type "Today", as they should. ()
  • fixedSelecting a date and typing @ will now bring up the autocompleter to find that date (this used to work, but broke) ()
  • fixedFixed BC dates in Tana Paste (note that they follow the ISO pattern, so they are actually one off - ie. 1 BC is year 0, [[date:-0001]] is 2 BC etc. ()
  • fixedWe now show AD on dates before year 0 more consistently ()
  • improvedAdded support for search query FOR RELATIVE DATE THIS/NEXT/LAST YEAR ()
  • fixedFixed bug where whole-day events would sometimes display as lasting two days in calendar view ()
  • fixedFixed bug where pure dates (with no time) in shared workspaces would also change depending on time zone. ()

Related FAQs

Examples

  • How can I extract the start date of a range using Commands?
    Sep 26, 2024

    Use Insert relative date command, here's an example:

Question

  • Should I use the DUE DATE field?
    Sep 26, 2024

    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
  • Can you have a different supertag applied to your day nodes based on a specific interval?
    Sep 26, 2024

    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, or JAN-DEC

    DAY-OF-WEEK

    • MON-SUN, or 1-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.
  • I have dates written as text, how can I convert them to Tana dates?
    Sep 26, 2024

    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
  • The calendar nodes I made in other workspaces doesn't have the default tags. How do I make them?
    Sep 26, 2024

    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, go to the node options menu and you should see an option to "Create default day/week/month/year tag". Once it's created, you can rename and customize it like any other supertag.

    You can see all the tags you've created for your day/week/month/year nodes by going to Settings > Journaling

    Advanced config: How to set up calendar node tags based on specific intervals

    For more detail, check out the documentation on the Dates and Calendar nodes page.

  • Where is the calendar in Tana?
    Sep 26, 2024

    Tana doesn't technically have something called "the" calendar.

    The question of "how can I do X with the calendar" doesn't really apply because there is no definitive calendar widget as seen in many other apps.

    What Tana does have is calendar views, date fields, and daily notes (also called calendar nodes).

    You can arrange child nodes in a calendar view defined by the date field you pick in the view, and you can take notes within the daily notes/calendar nodes like a journal. In more detail:

    • The calendar view: A "view", like view as table, view as list, view as cards, or view as calendar, is a setting on a node that determines how its children will be displayed. In the case of a search node, the search results are the children. One calendar view might show completely different things than another calendar view for the exact same period.
    • Date fields: Furthermore, what displays in a calendar view depends on which date field(s) you select in the view options. For example #todo nodes, found by a search node, might have multiple date fields such as >Created date, >Due date, >Date started, etc. Depending on what you select, the #todo nodes can appear on the date(s) of any/all of the above date fields.
    • Daily notes: When you press the Today button in the sidebar, you are taken to your daily notes, formerly called calendar nodes. These nodes represent different date granularities (day/week/month/year) and are connected to the dates they represent via the date object (via @today for example). But it is not common to view the calendar nodes in a calendar view, for instance.

    So, to summarize: there is no such thing as the calendar in Tana. The closest thing would be nodes with date information that are displayed in a calendar view.

    Based on a write-up by Navigator Darren Brierton

  • I need help with date search! How do I do X?
    Feb 13, 2024

    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 text

    LT/GT : Less than/Greater than field operators

    text : Text in this style is meant to be written out

    I 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
    • 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
    • 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

    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
    • relative to a date field of the parent node:
      • >LT : >your deadline field : PARENT.date field
      • >GT : >your deadline field : PARENT.date field-7
    • relative to the date of a calendar node:
      • >LT : >your deadline field : PARENT
      • >GT : >your deadline field : PARENT-7

    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

  • How can I retrieve tasks dated for today?
    Jan 17, 2024

    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 the PARENT 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 with PARENT to match a range of dates before/after today. Example:
        • >GT:PARENT-3
        • >LT:PARENT
        • = Any match between today and three days ago.

    If not on a day node

    • Use FOR RELATIVE DATE [term] as keyword field value for the Date field of the task, and insert today as the term, without the brackets.