Guide

Níveis de precisão do carimbo de data / hora: segundos, milissegundos, microssegundos e nanossegundos explicados

Compreendendo a precisão do carimbo de data/hora

Precisão do carimbo de data/hora refere-se ao nível de detalhe em que um carimbo de data/hora mede o tempo. Diferentes aplicações exigem diferentes níveis de precisão, desde precisão básica de segundo nível até medições ultraprecisas de nanossegundos. Compreender esses níveis de precisão é crucial para escolher o formato certo para seu caso de uso.

Os quatro principais níveis de precisão são:

  1. Segundos (10 dígitos) - carimbo de data/hora Unix padrão
  2. Milisegundos (13 dígitos) - JavaScript, padrão Java
  3. Microssegundos (16 dígitos) – Sistemas de alta precisão
  4. Nanossegundos (19 dígitos) – Cronometragem ultraprecisa

Os quatro níveis de precisão

1. Segundos (10 dígitos)

Carimbo de data e hora Unix padrão - O formato original e mais comum.

Formato

Example: 1704067200
Represents: January 1, 2024, 00:00:00 UTC
Precision: 1 second
Digit Count: 10 digits

Características

  • Intervalo: 13 de dezembro de 1901 a 19 de janeiro de 2038 (assinado em 32 bits)
  • Intervalo: 21 de setembro de 1677 a 4 de dezembro de 292.277.026.596 (assinado de 64 bits)
  • Armazenamento: 4 bytes (32 bits) ou 8 bytes (64 bits) Precisão: ±0,5 segundos

Quando usar

  • Registro de eventos (registro de usuário, horários de login)
  • Carimbos de data e hora do banco de dados (criado_at, atualizado_at)
  • Tempos de modificação de arquivos
  • Agendamento de tarefas (cron jobs, processos em lote)
  • Carimbo de data e hora geral onde a precisão de menos de um segundo não é necessária

Exemplos de código

C/C++

c
#include <time.h>
#include <stdio.h>

int main() {
    time_t timestamp = time(NULL);
    printf("Current timestamp: %ld\n", timestamp);
    // Output: 1704067200 (10 digits)
    return 0;
}

Píton

import time

timestamp = int(time.time())
print(f"Current timestamp: {timestamp}")
# Output: 1704067200 (10 digits)

PHP

<?php
$timestamp = time();
echo "Current timestamp: $timestamp\n";
// Output: 1704067200 (10 digits)
?>

SQL

-- Most databases store TIMESTAMP with second precision
SELECT UNIX_TIMESTAMP();
-- Output: 1704067200

2. Milissegundos (13 dígitos)

JavaScript/Java Standard – Adiciona três casas decimais para precisão de milissegundos.

Formato

Example: 1704067200000
Represents: January 1, 2024, 00:00:00.000 UTC
Precision: 0.001 seconds (1 millisecond)
Digit Count: 13 digits

Características

  • Intervalo: ±8.640.000.000.000.000 milissegundos da época
  • Armazenamento: 8 bytes (número inteiro de 64 bits ou duplo) Precisão: ±0,0005 segundos (0,5 milissegundos)
  • Resolução: 1/1.000 de segundo

Quando usar

  • Aplicativos Web (JavaScript Date.now())
  • Monitoramento de desempenho (tempos de resposta da API)
  • Tempo de animação (taxas de quadros, transições)
  • Acompanhamento de eventos (tempos de clique, interações do usuário)
  • Sistemas de negociação (preços de ações, execução de ordens)
  • Comunicações em tempo real (aplicativos de chat)

Exemplos de código

JavaScript

// Get current timestamp in milliseconds
const timestamp = Date.now();
console.log(timestamp);
// Output: 1704067200000 (13 digits)

// Create Date from millisecond timestamp
const date = new Date(1704067200000);
console.log(date.toISOString());
// Output: 2024-01-01T00:00:00.000Z

Java

// Get current timestamp in milliseconds
long timestamp = System.currentTimeMillis();
System.out.println(timestamp);
// Output: 1704067200000 (13 digits)

// Create Date from millisecond timestamp
Date date = new Date(1704067200000L);
System.out.println(date);

Píton

import time

# Get timestamp in milliseconds
timestamp_ms = int(time.time() * 1000)
print(f"Millisecond timestamp: {timestamp_ms}")
# Output: 1704067200000 (13 digits)

Node.js

// High-resolution time in milliseconds
const start = performance.now();
// ... some operation ...
const end = performance.now();
console.log(`Operation took ${end - start} milliseconds`);

3. Microssegundos (16 dígitos)

Sistemas de alta precisão - Seis casas decimais para precisão de microssegundos.

Formato

Example: 1704067200000000
Represents: January 1, 2024, 00:00:00.000000 UTC
Precision: 0.000001 seconds (1 microsecond)
Digit Count: 16 digits

Características

  • Alcance: Extremamente amplo (±292.471 anos da época)
  • Armazenamento: 8 bytes (número inteiro de 64 bits) Precisão: ±0,0000005 segundos (0,5 microssegundos)
  • Resolução: 1/1.000.000 de segundo

Quando usar

  • Sistemas de banco de dados (PostgreSQL, MongoDB)
  • Computação científica (simulações de física)
  • Protocolos de rede (carimbo de data e hora do pacote)
  • Processamento de áudio/vídeo (sincronização de quadros)
  • Negociação de alta frequência (execução em nível de microssegundos)
  • Sistemas distribuídos (ordenação de eventos, causalidade)

Exemplos de código

Píton

import time

# Get timestamp in microseconds
timestamp_us = int(time.time() * 1_000_000)
print(f"Microsecond timestamp: {timestamp_us}")
# Output: 1704067200000000 (16 digits)

# Using datetime
from datetime import datetime
dt = datetime.now()
timestamp_us = int(dt.timestamp() * 1_000_000)
print(f"Microsecond timestamp: {timestamp_us}")

Ir

package main

import (
    "fmt"
    "time"
)

func main() {
    // Get current timestamp in microseconds
    timestamp := time.Now().UnixMicro()
    fmt.Printf("Microsecond timestamp: %d\n", timestamp)
    // Output: 1704067200000000 (16 digits)
}

PostgreSQL

-- PostgreSQL stores timestamps with microsecond precision
SELECT EXTRACT(EPOCH FROM NOW()) * 1000000;
-- Output: 1704067200000000

-- Create timestamp with microsecond precision
SELECT to_timestamp(1704067200.123456);
-- Output: 2024-01-01 00:00:00.123456+00

C++

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;

    // Get microsecond timestamp
    auto now = system_clock::now();
    auto micros = duration_cast<microseconds>(
        now.time_since_epoch()
    ).count();

    std::cout << "Microsecond timestamp: " << micros << std::endl;
    // Output: 1704067200000000 (16 digits)
    return 0;
}

4. Nanossegundos (19 dígitos)

Tempo ultrapreciso - Nove casas decimais para precisão de nanossegundos.

Formato

Example: 1704067200000000000
Represents: January 1, 2024, 00:00:00.000000000 UTC
Precision: 0.000000001 seconds (1 nanosecond)
Digit Count: 19 digits

Características

  • Intervalo: ±292 anos a partir da época (assinado em 64 bits)
  • Armazenamento: 8 bytes (número inteiro de 64 bits) Precisão: ±0,0000000005 segundos (0,5 nanossegundos)
  • Resolução: 1/1.000.000.000 de segundo

Quando usar

  • Perfil de desempenho (medições do ciclo da CPU)
  • Instrumentação de hardware (osciloscópios, analisadores lógicos)
  • Desenvolvimento de kernel (carimbos de data e hora do agendador)
  • Sistemas em tempo real (robótica, aeroespacial)
  • Carimbo de data/hora criptográfico (blockchain, segurança)
  • Experimentos de física (detecção de partículas)

Exemplos de código

package main

import (
    "fmt"
    "time"
)

func main() {
    // Get current timestamp in nanoseconds
    timestamp := time.Now().UnixNano()
    fmt.Printf("Nanosecond timestamp: %d\n", timestamp)
    // Output: 1704067200000000000 (19 digits)

    // Benchmark operations
    start := time.Now()
    // ... some operation ...
    elapsed := time.Since(start).Nanoseconds()
    fmt.Printf("Operation took %d nanoseconds\n", elapsed)
}

Ferrugem

use std::time::{SystemTime, UNIX_EPOCH};

fn main() {
    // Get nanosecond timestamp
    let duration = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap();

    let nanos = duration.as_nanos();
    println!("Nanosecond timestamp: {}", nanos);
    // Output: 1704067200000000000 (19 digits)
}

C++

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;

    // Get nanosecond timestamp
    auto now = system_clock::now();
    auto nanos = duration_cast<nanoseconds>(
        now.time_since_epoch()
    ).count();

    std::cout << "Nanosecond timestamp: " << nanos << std::endl;
    // Output: 1704067200000000000 (19 digits)
    return 0;
}

Linux (C)

c
#include <time.h>
#include <stdio.h>

int main() {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);

    long long nanos = (long long)ts.tv_sec * 1000000000LL + ts.tv_nsec;
    printf("Nanosecond timestamp: %lld\n", nanos);
    // Output: 1704067200000000000 (19 digits)
    return 0;
}

Tabela de comparação de precisão

NívelPrecisãoDígitosExemploCasos de usoLinguagens/Sistemas
Segundo1s101704067200Logs, bancos de dados, agendamentoC, PHP, Python, SQL
Milissegundos1ms (10⁻³s)131704067200000Aplicativos Web, negociação, APIsJavascript, Java
Microssegundo1μs (10⁻⁶s)161704067200000000HFT, áudio/vídeo, redesPython, Go, PostgreSQL
Nanossegundos1s (10⁻⁹s)191704067200000000000Perfil, hardware, criptografiaVá, Ferrugem, C++

Convertendo entre níveis de precisão

Aumentando a escala (adicionando precisão)

// Second to Millisecond
const seconds = 1704067200;
const milliseconds = seconds * 1000;
// 1704067200000

// Millisecond to Microsecond
const microseconds = milliseconds * 1000;
// 1704067200000000

// Microsecond to Nanosecond
const nanoseconds = microseconds * 1000;
// 1704067200000000000

Reduzindo (Reduzindo a Precisão)

// Nanosecond to Microsecond
const nanos = 1704067200123456789;
const micros = Math.floor(nanos / 1000);
// 1704067200123456

// Microsecond to Millisecond
const millis = Math.floor(micros / 1000);
// 1704067200123

// Millisecond to Second
const secs = Math.floor(millis / 1000);
// 1704067200

Utilitário de conversão Python

class TimestampConverter:
    """Convert between different timestamp precision levels"""

    @staticmethod
    def to_milliseconds(timestamp, from_precision='seconds'):
        """Convert any precision to milliseconds"""
        multipliers = {
            'seconds': 1000,
            'milliseconds': 1,
            'microseconds': 0.001,
            'nanoseconds': 0.000001
        }
        return int(timestamp * multipliers[from_precision])

    @staticmethod
    def to_microseconds(timestamp, from_precision='seconds'):
        """Convert any precision to microseconds"""
        multipliers = {
            'seconds': 1_000_000,
            'milliseconds': 1000,
            'microseconds': 1,
            'nanoseconds': 0.001
        }
        return int(timestamp * multipliers[from_precision])

    @staticmethod
    def to_nanoseconds(timestamp, from_precision='seconds'):
        """Convert any precision to nanoseconds"""
        multipliers = {
            'seconds': 1_000_000_000,
            'milliseconds': 1_000_000,
            'microseconds': 1000,
            'nanoseconds': 1
        }
        return int(timestamp * multipliers[from_precision])

# Usage
converter = TimestampConverter()

# Convert 1704067200 seconds to milliseconds
ms = converter.to_milliseconds(1704067200, 'seconds')
print(ms)  # 1704067200000

Considerações de desempenho

Requisitos de armazenamento

Precisão32 bits64 bitsArmazenamento de banco de dados
Segundos4 bytes8 bytesTIMESTAMP (4-8 bytes)
Milissegundos❌ Estouro8 bytesBIGINT (8 bytes)
Microssegundos❌ Estouro8 bytesBIGINT (8 bytes)
Nanossegundos❌ Estouro8 bytesBIGINT (8 bytes)

Velocidade de processamento

// Benchmark: Different precision levels
const iterations = 1000000;

// Seconds (fastest)
console.time('Seconds');
for (let i = 0; i < iterations; i++) {
    const ts = Math.floor(Date.now() / 1000);
}
console.timeEnd('Seconds');
// ~10ms

// Milliseconds (fast)
console.time('Milliseconds');
for (let i = 0; i < iterations; i++) {
    const ts = Date.now();
}
console.timeEnd('Milliseconds');
// ~12ms

// Microseconds (slower)
console.time('Microseconds');
for (let i = 0; i < iterations; i++) {
    const ts = performance.now() * 1000;
}
console.timeEnd('Microseconds');
// ~25ms

Impacto na memória

import sys

# Storage comparison
second_ts = 1704067200
millisecond_ts = 1704067200000
microsecond_ts = 1704067200000000
nanosecond_ts = 1704067200000000000

print(f"Second: {sys.getsizeof(second_ts)} bytes")      # 28 bytes
print(f"Millisecond: {sys.getsizeof(millisecond_ts)} bytes") # 28 bytes
print(f"Microsecond: {sys.getsizeof(microsecond_ts)} bytes") # 28 bytes
print(f"Nanosecond: {sys.getsizeof(nanosecond_ts)} bytes")  # 32 bytes

# In arrays/databases, smaller integers = better performance

Precisão vs. Precisão

Compreendendo a diferença

  • Precisão: com que precisão você pode medir (o número de dígitos)
  • Precisão: quão próxima sua medição está do valor real
Example:
Precision: Nanosecond timestamp (19 digits)
Accuracy: System clock may only be accurate to ±50ms

Result: High precision, low accuracy

Limitações do relógio do sistema

SistemaResolução típicaPrecisão
Janelas15,6ms±10-50ms
Linux1μs - 1ms±1-10ms
macOS1μs±1-10ms
SO em tempo real1ns - 1μs±1μs

Testando a resolução do seu sistema

import time

def measure_clock_resolution():
    """Measure actual system clock resolution"""
    samples = []
    prev = time.time()

    for _ in range(100000):
        current = time.time()
        if current != prev:
            samples.append(current - prev)
            prev = current

    if samples:
        min_diff = min(samples)
        print(f"Minimum time difference: {min_diff * 1000:.6f}ms")
        print(f"Approximate resolution: {min_diff * 1_000_000:.2f}μs")

measure_clock_resolution()

Melhores práticas

1. Escolha a precisão apropriada

# ✅ GOOD: Match precision to use case
user_login_time = int(time.time())  # Seconds are enough

# ❌ BAD: Unnecessary precision
user_login_time = int(time.time() * 1_000_000_000)  # Overkill!

2. Armazene de forma consistente

-- ✅ GOOD: Consistent precision across table
CREATE TABLE events (
    id BIGINT PRIMARY KEY,
    created_at BIGINT,      -- All in milliseconds
    updated_at BIGINT       -- All in milliseconds
);

-- ❌ BAD: Mixed precision
CREATE TABLE events (
    id BIGINT PRIMARY KEY,
    created_at INT,         -- Seconds
    updated_at BIGINT       -- Milliseconds (inconsistent!)
);

3. Documente sua escolha

/**
 * Timestamp precision: Milliseconds (13 digits)
 * Format: Unix timestamp * 1000
 * Example: 1704067200000 = Jan 1, 2024 00:00:00.000 UTC
 */
const timestamp = Date.now();

4. Lide com a conversão com cuidado

# ✅ GOOD: Explicit conversion
def seconds_to_milliseconds(seconds):
    """Convert seconds to milliseconds"""
    return int(seconds * 1000)

# ❌ BAD: Implicit/unclear
def convert(ts):
    return ts * 1000  # What precision is this?

5. Validar a precisão

function validateTimestamp(timestamp, expectedPrecision) {
    const digitCount = timestamp.toString().length;

    const expectedDigits = {
        'seconds': 10,
        'milliseconds': 13,
        'microseconds': 16,
        'nanoseconds': 19
    };

    if (digitCount !== expectedDigits[expectedPrecision]) {
        throw new Error(
            `Invalid ${expectedPrecision} timestamp: expected ${expectedDigits[expectedPrecision]} digits, got ${digitCount}`
        );
    }

    return true;
}

// Usage
validateTimestamp(1704067200000, 'milliseconds');  // ✅ Pass
validateTimestamp(1704067200, 'milliseconds');     // ❌ Error

Armadilhas Comuns

1. Perda de precisão em ponto flutuante

// ❌ BAD: JavaScript Number precision limit
const nanos = 1704067200123456789;  // 19 digits
console.log(nanos);
// Output: 1704067200123456800 (last digits lost!)

// ✅ GOOD: Use BigInt for nanoseconds
const nanos = 1704067200123456789n;
console.log(nanos.toString());
// Output: 1704067200123456789 (exact)

2. Confusão de fuso horário

# ❌ BAD: Local time affects precision
import datetime
local_time = datetime.datetime.now()  # Includes local timezone
timestamp = local_time.timestamp()

# ✅ GOOD: Always use UTC
utc_time = datetime.datetime.utcnow()
timestamp = utc_time.timestamp()

3. Problemas de estouro

c
// ❌ BAD: 32-bit overflow with milliseconds
int32_t timestamp_ms = time(NULL) * 1000;  // Overflow!

// ✅ GOOD: Use 64-bit for higher precision
int64_t timestamp_ms = (int64_t)time(NULL) * 1000;

Ferramentas relacionadas

Use nossas ferramentas gratuitas para trabalhar com diferentes precisões de carimbo de data/hora:

Conclusão

Compreender os níveis de precisão do carimbo de data/hora é essencial para o desenvolvimento de software moderno. Escolha o nível de precisão correto com base em seus requisitos específicos:

  • Segundos: carimbo de data/hora de uso geral, logs, bancos de dados
  • Milisegundos: aplicativos Web, APIs, recursos em tempo real
  • Microssegundos: negociação de alta frequência, computação científica
  • Nanossegundos: perfil de desempenho, instrumentação de hardware

Lembre-se:

  • Maior precisão = Mais armazenamento + Mais processamento
  • Combine a precisão com a precisão real do sistema
  • Seja consistente em toda a sua aplicação
  • Documente sua escolha para futuros desenvolvedores

Última atualização: janeiro de 2025