edmundobiglia

edmundobiglia

I’m somewhat new to Elixir. I have a Phoenix project and I need my endpoints to always return DateTime, even when NaiveDateTime fields are passed to render functions on views. I tried to do a custom implementation of Jason.Encoder, but it is not working.

Original implementation (/deps/jason/lib/encoder.ex):

defimpl Jason.Encoder, for: [Date, Time, NaiveDateTime, DateTime] do
  def encode(value, _opts) do
    [?\", @for.to_iso8601(value), ?\"]
  end
end

My implementation (my_project/lib/my_project/custom_encoder.ex)

defimpl Jason.Encoder, for: NaiveDateTime do
  def encode(value, _opts) do
    value |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601()
  end
end

However, this does nothing. Even if I change the original lib file implementation and recompile, I still get naive datetimes on my endpoints. Could anyone shed some light on how could I achieve this?

Many thanks in advance!

Showing Posts 1 to 1

joaoevangelista

joaoevangelista

Unfortunately an overriding implementation will not work because Elixir does not support overriding protocols. Here is a similar case to yours.

You would need to create a wrapper struct and then create an Jason.Encoder implementation for it. For example:

defmodule MyApp.TzDateTime do
  @type t :: %__MODULE__{value: DateTime.t()}

  @enforce_keys :value
  defstruct value: nil

  @spec new(DateTime.t() | NaiveDateTime.t()) :: t()
  def new(%DateTime{} = value) do
    %__MODULE__{value: value}
  end

  def new(%NaiveDateTime{} = value) do
    %__MODULE__{value: DateTime.from_naive!(value, "Etc/UTC")}
  end

  defimpl Jason.Encoder do
    def encode(%MyApp.TzDateTime{value: value}, _opts), do: DateTime.to_iso8601(value)
  end
end

And on your Phoenix view that renders the JSON:

defmodule MyApp.MyStuffView do
  use MyApp, :view

  def render("index.json", %{mystuffs: mystuffs}) do
    %{data: render_many(mystuffs, MyApp.MyStuffView, "mystuff.json")}
  end

  def render("show.json", %{mystuff: mystuff}) do
    %{data: render_one(mystuff, MyApp.MyStuffView, "mystuff.json")}
  end

  def render("mystuff.json", %{mystuff: mystuff}) do
    %{date: MyApp.TzDateTime.new(Mystuff.my_date_field)}
  end
end

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
mnkhod
So i have been using ash framework for a while and i love it. However currently the issue im having with ash framework is the error handl...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews