Uma DSL para manipular datas em JavaScript

Em: 11/02/2008 Tags: Referencie do seu blog (Trackback)

Hoje precisei realizar uma operação que, inicialmente, me parecia bastante simples: a partir de um objeto Date do JavaScript, queria calcular um outro objeto Date, sendo que o segundo representaria uma data 5 dias no passado. Fácil? Não foi. É verdade, eu estava sem uma boa referência por perto, mas a verdade é que não consegui descobrir como fazê-lo em poucas linhas. Uma nova busca no Google e encontro a DateJS, que é exatamente o que eu procurava: uma DSL para manipulação de datas em JavaScript.

Como ela resolveu meu problema? Em 1 linha. Os exemplos abaixo mostram a utilização da biblioteca a partir da linha de comando, com o Rhino. Na segunda linha do exemplo está a solução para o meu problema inicial.

js> load('date.js')
js> (5).days().ago()
Wed Feb 06 2008 20:47:28 GMT-0200 (BRST)
js> Date.today().is().monday()
true
js> Date.parse('next saturday')
Sat Feb 16 2008 00:00:00 GMT-0200 (BRST)

Faça o download e confira como é fácil utilizá-la! O site oficial mostra outros exemplos interessantes.

Artigos relacionados:

5 respostas para “Uma DSL para manipular datas em JavaScript”

  1. Thânia Clair disse:

    Adorei a biblioteca, muito intuitiva. Só pra ver se entendi, o javascript não dá suporte pra data ou dá de uma maneira deselegante?

  2. Caio Moritz Ronchi disse:

    Dá suporte, sim, mas não considero muito fácil de usar para “aritmética de datas”, que é o que eu estava tentando fazer. Alguns exemplos de uso mostram como ela possui alguns métodos pouco intuitivos (repare nos resultados de cada método):

    js> today = new Date()
    Mon Feb 11 2008 23:33:50 GMT-0200 (BRST)
    js> today.getYear()
    108
    js> today.getFullYear()
    2008
    js> today.getMonth()
    1
    js> today.getSeconds()
    50
    

    Algumas coisas estranhas:

    • O que é aquele 1 dentro do resultado de getYear()?
    • Por que getMonth() volta o número 1, e não 2, se estamos em fevereiro?
    • O que getSeconds() retorna, exatamente?

    Nada que um pouco de Google não pudesse resolver, mas a DateJS me parece incomparável a qualquer outra solução “manual” do meu problema.

  3. Thânia Clair disse:

    Bem parecido com o Java, ou seja, nada deduzível ou intuitivo.

    :P

  4. Rômulo Barros disse:

    Simples: today.getYear() - Retorna o total de anos a partir do ano 1900 108

    today.getMonth() - Retorna o mês atual (array com elemento inicial 0) 1

    Onde, 0 –> Janeiro 1 –> Fevereiro 2 — > Março

    etc…

  5. Caio Moritz Ronchi disse:

    Rômulo, pode até ser simples depois de ler a explicação, mas não é intuitivo.

Escreva um comentário (utilize o formato Markdown)