Pular para o conteúdo principal

Datas

A manipulação de data e hora é crucial na maioria das aplicações. Veja como diferentes linguagens lidam com datas, tanto com recursos nativos quanto com bibliotecas populares.

Operações Nativas com Datas​

Data e Hora Atual​

// Current date/time
const now = new Date();
console.log(now); // 2024-01-15T10:30:00.000Z

// Get components
now.getFullYear(); // 2024
now.getMonth(); // 0 (January, 0-indexed)
now.getDate(); // 15
now.getHours(); // 10
now.getMinutes(); // 30
now.getSeconds(); // 0
now.getDay(); // 1 (Monday, 0=Sunday)

Criando Datas​

// From string
const date1 = new Date("2024-01-15");
const date2 = new Date("2024-01-15T10:30:00");

// From components
const date3 = new Date(2024, 0, 15); // month is 0-indexed
const date4 = new Date(2024, 0, 15, 10, 30, 0);

// From timestamp
const date5 = new Date(1705312200000); // milliseconds

Formatando Datas​

const date = new Date(2024, 0, 15, 10, 30, 0);

// Basic formatting
date.toISOString(); // "2024-01-15T10:30:00.000Z"
date.toLocaleDateString(); // "1/15/2024" (locale-dependent)
date.toLocaleString(); // "1/15/2024, 10:30:00 AM"

// Custom formatting (manual or use Intl)
const formatter = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
formatter.format(date); // "01/15/2024, 10:30 AM"

Aritmética com Datas​

const date = new Date(2024, 0, 15);

// Add/subtract days
date.setDate(date.getDate() + 7); // Add 7 days
date.setDate(date.getDate() - 3); // Subtract 3 days

// Add/subtract months
date.setMonth(date.getMonth() + 1); // Add 1 month

// Add/subtract years
date.setFullYear(date.getFullYear() + 1); // Add 1 year

// Difference in milliseconds
const date1 = new Date(2024, 0, 15);
const date2 = new Date(2024, 0, 20);
const diff = date2 - date1; // 432000000 ms (5 days)

Bibliotecas Populares​

// date-fns (modern, tree-shakeable)
import { format, addDays, differenceInDays, parseISO } from 'date-fns';

const date = new Date(2024, 0, 15);

// Formatting
format(date, 'yyyy-MM-dd'); // "2024-01-15"
format(date, 'MMMM d, yyyy'); // "January 15, 2024"

// Arithmetic
addDays(date, 7); // Add 7 days
differenceInDays(date2, date1); // Difference in days

// Parsing
parseISO("2024-01-15"); // Date object

// moment.js (legacy, but still popular)
const moment = require('moment');

moment().format('YYYY-MM-DD'); // "2024-01-15"
moment().add(7, 'days'); // Add 7 days
moment().subtract(3, 'days'); // Subtract 3 days
moment(date2).diff(moment(date1), 'days'); // Difference

Principais Conclusões​

  • Maturidade da biblioteca padrão — O java.time do Java, o datetime do Python, o time do Go e o DateTime do C# fornecem APIs nativas ricas para análise, formatação, aritmética e comparação. Por exemplo, o time.Parse("2006-01-02", "2024-01-15") do Go e o datetime.strptime("2024-01-15", "%Y-%m-%d") do Python analisam datas sem dependências extras. C, Zig e Rust oferecem apenas timestamps básicos na biblioteca padrão; desenvolvedores Rust geralmente usam o crate chrono para suporte completo a datas. Se você precisa de datas prontas para uso, escolha Java, Python, Go ou C#; para trabalho em sistemas, planeje adicionar uma biblioteca de datas.

  • Convenções de formatação — Cada linguagem usa strings de formato diferentes: Go usa 2006-01-02 15:04:05 (data de referência como mnemônico); Python usa %Y-%m-%d %H:%M:%S; C# usa yyyy-MM-dd HH:mm:ss; Java usa DateTimeFormatter.ofPattern("yyyy-MM-dd"). A abordagem do Go é memorável porque a data de referência é literal: mês 01, dia 02, hora 15, etc. Ao trocar de linguagem, mantenha uma tabela de referência de formatos à mão — misturar esses formatos (ex.: %y vs %Y para ano) causa bugs sutis.

  • Tratamento de fuso horário — O ZonedDateTime do Java, o dateutil.tz do Python, o NodaTime do C# e o chrono do Rust fornecem suporte robusto a fusos horários. O Date do JavaScript é centrado em UTC: getHours() retorna hora local, mas o armazenamento é UTC, o que pode confundir desenvolvedores. C e C++ exigem tratamento manual com localtime/gmtime ou bibliotecas externas. Para aplicações que precisam exibir ou armazenar horários em múltiplos fusos, prefira Java, Python ou C# com NodaTime; evite C/C++ a menos que esteja preparado para integrar uma biblioteca de fusos horários.

  • Bibliotecas populares — date-fns (JavaScript), Carbon (PHP), chrono (Rust) e NodaTime (C#) estendem os recursos nativos com formatação legível, análise natural e tratamento mais seguro de fusos horários. Por exemplo, o $date->diffForHumans() do Carbon retorna "2 hours ago." Zig e C têm suporte mínimo de ecossistema — a maioria dos projetos usa std.time ou timestamps Unix brutos. Se você precisa de recursos avançados de data (ex.: "próxima terça-feira", "fim do mês"), escolha uma linguagem com uma biblioteca de datas madura.