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

  • improvedClicking a date field now opens the date picker automatically ()
  • newNew buttons for date navigation on calendar nodes! Right-click on "Today" to navigate to this week/month/year. ()
  • newWe renamed Calendar to Daily Notes, and gave it a node icon. ()
  • fixedWe fixed a bug where the reference section disappeared on all calendar nodes. You could say the references were... out of time. 🕶️ ()
  • fixedWe no longer format dates as "21th", "22th" and "23th" in calendar view. Instead, we've chosen the less creative "21st", "22nd", and "23rd". ()
  • improvedTightened up representation of date formatting when context is obvious, and for ranges. ()

Related FAQs

  • How can I extract the start date of a range using Commands?

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

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