Skip to content

Can not create a TimestampNanosecondArray that has a specified timezone #597

@alamb

Description

@alamb

Describe the bug
I can not create a PrimitiveArray that has a DataType::Timestamp with a timezone other than None

To Reproduce
I am trying to pretty print an array that has timestamps using UTC time.

So instead of 1970-01-01 00:00:00.000000100 I want to print something more like the following (note the Z, in RFC3339): 1970-01-01T00:00:00.000000100Z

To do so I figured I would "simply" create a new array that had a Timestamp type with the timezone set to UTC

TimestampNanosecondArray is defined like this:

pub type TimestampNanosecondArray = PrimitiveArray<TimestampNanosecondType>;

And TimestampNanosecondType is (effectively) something like

struct TimestampNanosecondType {}
impl ArrowPrimitiveType for TimestampNanosecondType {
  type Native = i64;
  const DATA_TYPE = DataType::Timestamp(TimeUnit::Nanosecond, None)
}

So I figured I would make a PrimitiveArray<SOME_TYPE_THAT_HAD_MY_TIMEZONE_SPECIFIED>

struct TimestampUtcNanosecondType {}
impl ArrowPrimitiveType for TimestampUtcNanosecondType {
    type Native = i64;
    const DATA_TYPE: DataType = DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".to_string()));
}

Uhoh! The compiler doesn't like that because it needs a const String which you can't have....

error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
  --> src/main.rs:38:80
   |
38 |     const DATA_TYPE: DataType = DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".to_string()));
   |                                                                                ^^^^^^^^^^^^^^^^^^^^

So I conclude it is basically impossible to create an array with a timezone other than None

Expected behavior
I expect to be able to create an array using a timezone

Proposal

Proposal:

Change DataType::Timestamp from

Timestamp(TimeUnit, Option<String>),

to

Timestamp(TimeUnit, Option<&static str>),

Additional context
FWIW I also tried using lazy_static but it doesn't provide a const String (only a static String)

I view this as a potential first step towards handling timestamps properly in arrow and datafusion: apache/datafusion#686

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugenhancementAny new improvement worthy of a entry in the changelog

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions