hackersleepyhead

hackersleepyhead

Protobuf NaiveDateTime type

Hello,

what would be the best type for proto3 to handle NaiveDateTime from Elixir types.

message PostResponse {
    string content = 1;
    string id = 2;
    google.protobuf.Timestamp inserted_at = 3;
    google.protobuf.Timestamp updated_at = 4;
    string user_id = 5;
}

I think Timestamp is not the best one, I want to have the NativeDateTime type value as it is.
any help would be appreciated.

First Post!

dimitarvp

dimitarvp

Well, NaiveDateTime is just a struct / map after all:

iex(1)> NaiveDateTime.now() |> Map.keys()
[:__struct__, :calendar, :day, :hour, :microsecond, :minute, :month, :second,
 :year]

The calendar field is usually the module/atom Calendar.ISO so you can strip it if you don’t deal with other calendars, and the special __struct__ field, and then end up with this:

iex(2)> NaiveDateTime.utc_now() |> Map.from_struct() |> Map.drop([:__struct__, :calendar])
%{
  day: 10,
  hour: 12,
  microsecond: {981284, 6},
  minute: 32,
  month: 3,
  second: 40,
  year: 2021
}

You can then also remove the decimal precision value from microsecond by using elem(..., 0) and then you’ll just have seven unsigned 32-bit integers (which you can encode with int32 since it uses variable-length encoding over the wire). That resulting map of seven integers can then very easily be described as a nested Protobuf structure afterwards.

Of course, you can also convert the NaiveDateTime to UNIX seconds / milliseconds / microseconds / nanoseconds and just encode the whole thing as a 64-bit unsigned integer:

naive_date_time_from_another_function
|> DateTime.from_naive!("Etc/UTC") # assuming your times are in UTC
|> DateTime.to_unix(:microsecond) # or :second, or :millisecond, or :nanosecond)

Where Next?

Popular in Questions Top

skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 42920 311
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement