anchor.diff:  
   ==== Datetime Representation
   
  -Datetimes in Painless are most commonly represented as a
  -<<primitive-types, long>>, a <<string-type, String>>, or a
  -<<painless-api-reference-shared-ZonedDateTime, ZonedDateTime>>.
  -
  -long:: represents a datetime as the number of milliseconds or nanoseconds since
  -epoch (1970-01-01T00:00:00Z)
  -String:: represents a datetime as a sequence of characters defined by a
  -well-known standard such as https://en.wikipedia.org/wiki/ISO_8601[ISO 8601] or
  -defined by the source of input in a custom way
  -ZonedDateTime:: a <<reference-types, reference type>> (object) that contains an
  -internal representation of a datetime and provides numerous
  -<<painless-api-reference-shared-ZonedDateTime, methods>> for
  -modification and comparison.
  +Datetimes in Painless are most commonly represented as a numeric value, a
  +string value, or a complex value.
  +
  +numeric:: a datetime representation as a number from a starting offset called
  +an epoch; in Painless this is typically a <<primitive-types, long>> as
  +milliseconds since an epoch of 1970-01-01 00:00:00 Zulu Time
  +string:: a datetime representation as a sequence of characters defined by
  +a standard format or a custom format; in Painless this is typically a
  +<<string-type, String>> of the standard format
  +https://en.wikipedia.org/wiki/ISO_8601[ISO 8601]
  +complex:: a datetime representation as a complex type
  +(<<reference-types, object>>) that abstracts away internal details of how the
  +datetime is stored and often provides utilities for modification and
  +comparison; in Painless this is typically a
  +<<painless-api-reference-shared-ZonedDateTime>>
   
   Switching between different representations of datetimes is often necessary to
   achieve a script's objective(s). A typical pattern in a script is to switch a
  -long or String representation of a datetime to a ZonedDateTime representation,
  -modify or compare the ZonedDateTime representation, and then switch it back to
  -a long or String representation for storage or as a returned result.
  +numeric or string datetime to a complex datetime, modify or compare the complex
  +datetime, and then switch it back to a numeric or string datetime for storage
  +or to return a result.
   
   ==== Datetime Parsing and Formatting
   
  -Datetime parsing is a switch from a String representation to a ZonedDateTime
  -representation, and datetime formatting is a switch from a ZonedDateTime
  -representation to a String representation.
  +Datetime parsing is a switch from a string datetime to a complex datetime, and
  +datetime formatting is a switch from a complex datetime to a string datetime.
   
   A <<painless-api-reference-shared-DateTimeFormatter, DateTimeFormatter>> is a
  -<<reference-types, reference type>> (object) that defines the allowed sequence
  -of characters for a String representation of a datetime. Datetime parsing and
  -formatting often requires a DateTimeFormatter. For more information about how
  -to use a DateTimeFormatter see the
  +complex type (<<reference-types, object>>) that defines the allowed sequence
  +of characters for a string datetime. Datetime parsing and formatting often
  +requires a DateTimeFormatter. For more information about how to use a
  +DateTimeFormatter see the
   {java11-javadoc}/java.base/java/time/format/DateTimeFormatter.html[Java documentation].
   
   ===== Datetime Parsing Examples
  
positive.code: milliSinceEpoch = milliSinceEpoch - 1000L*3L;
  ----
  +
  * Add three days to a datetime
  +
  [source,Painless]
  ----
  
negative.code: 
  ==== Datetime Pieces
  
  Datetime representations often contain the data to extract individual datetime
  pieces such as year, hour, timezone, etc. Use individual pieces of a datetime
  to create a complex datetime, and use a complex datetime to extract individual
  pieces.
  
  ===== Datetime Pieces Examples
  
  * create a complex datetime from pieces
  +
  [source,Painless]
  ----
  