Criando o próprio sistema para contar o tempo

Medir o tempo é uma tarefa séria e mais complicada do que parece. Como bom nerd, sou fascinado pelos vários métodos de medir e contar o tempo. Um dos que mais me chama a atenção é o “tempo decimal”.

Existem várias implementações de tempo decimal, dividindo geralmente o dia em 10 horas de 100 minutos cada. Outra abordagem é ignorar as horas e usar apenas os minutos como um número contínuo. Se precisar de mais precisão, basta usar frações desse minuto, quantas casas decimais forem necessárias.

Pode parecer estranho, mas é muito fácil de visualizar. Você se acostuma rápido com 1000 minutos por dia e, depois de alguns dias, começa a perceber um padrão, assim como acontece com relógios de ponteiro. Nesse caso, os ponteiros servem como uma barra de progresso do dia.

Explorando Possibilidades

É possível ir além, por exemplo, criando um calendário decimal com 10 meses por ano e 36,52422 dias por mês. No entanto, um calendário decimal não é tão útil. Não preciso calcular o solstício de inverno nem a data da colheita. Para mim, medir o tempo de um dia já é suficiente, pois a maioria dos meus dias é dividida entre dormir e estar na frente do computador (e se você está lendo isso, provavelmente para você também).

O grande problema de alterar algo que todo mundo está acostumado, como a forma de medir o tempo, é que, para dar certo, todos precisam aderir. Caso contrário, você terá que ficar fazendo conversões de um sistema para o outro. Não importa o quão boa seja a ideia, mudanças são difíceis. É por isso que os norte-americanos não usam o sistema métrico no dia a dia.

Tentativas Recentes

A tentativa mais recente de um relógio decimal foi feita pela Swatch, que em 1998 criou o Swatch Internet Time, com o dia dividido em 1000 partes chamadas de .beats, cada uma durando 86,40 segundos.

A ideia era que não haveria fuso horário, todo mundo usaria o horário da sede da empresa em Biel, na Suíça, equivalente a UTC+1. Assim, se você marcar uma call com alguém, não importa onde essa pessoa esteja no planeta, a contagem dos .beats seria a mesma para todos.

Usar a sede da empresa em vez de UTC só complicou a conta e diminuiu a chance de adoção do sistema, que já era extremamente pequena.

echo '@'$(TZ=UTC+1 date +'(%-S + %-M * 60 + %-H * 3600) / 86.4'|bc)

Criando Meu Próprio Sistema

Mesmo assim, a ideia é interessante. Por brincadeira, por que não criar meu próprio sistema?

Vou chamá-lo de hora individual (Individual Time, porque Personal Time soa como tempo gasto no banheiro).

Vejamos

  • Assim como outras implementações, o dia será dividido em 1000 partes de 86,40 segundos cada.
  • A hora zero/fuso horário é definida pelo usuário e não precisa estar ligada à localização geográfica. Como é pessoal, ele pode usar o que quiser como hora zero. No meu caso, vou usar UTC-3.
  • Caso milagrosamente alguém queira compartilhar a hora de um evento comigo, precisa incluir o seu diferencial de tempo. Como é pessoal, será UTC mais ou menos alguma coisa, onde essa alguma coisa pode inclusive ser uma fração.
  • Como símbolo, no lugar do @, vou usar 時の (tokino), que significa “do tempo” ou “do relógio”. O motivo é puramente estético. Então, por exemplo, temos 時の500 para 12h00 e 時の750 para 18h00.

Implementação

Criar um programa que exibe a hora decimal atual é simples e será rápido em praticamente qualquer linguagem, mas preciso que seja muito rápido porque quero que a hora, seja exibida no tmux e se for lento a barra do tmux pode acabar piscando. Então resolvi escrever em C.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    time_t now = time(NULL);
    struct tm *utc = gmtime(&now);

    int t = 0;
    char *format = NULL;
    char buffer[80];
    int opt;

    while ((opt = getopt(argc, argv, "t:f:")) != -1) {
        switch (opt) {
            case 't':
                t = atoi(optarg);
                continue;
            case 'f':
                format = optarg;
                continue;
            default:
                fprintf(stderr, "Usage: %s [-t timezone] [-f format]\n", argv[0]);
                return 1;
        }
    }

    if (t < -12 || t > 12) {
        fprintf(stderr, "Invalid timezone\n");
        return 1;
    } 

    // Adjust hour with timezone and normalize to [0, 23]
    int adjusted_hour = (utc->tm_hour + t + 24) % 24;

    // Calculate the beat value (Swatch Internet Time)
    int total_seconds_bmt = adjusted_hour * 3600 + utc->tm_min * 60 + utc->tm_sec;
    float beat = total_seconds_bmt / 86.4;  // 1 day = 1000 beats so 1 beat = 86.4 seconds

    if (format == NULL) {
        format = "@%06.2f\n";
    }

    printf(format, beat);

    return 0;
}

Compilando

Este é um exemplo de Makefile para compilar o programa:

TARGET = internet_time

CC = clang
CFLAGS = -O3 \
		 -march=armv8-a \
		 -mtune=apple-m2 \
		 -flto \
		 -fomit-frame-pointer \
		 -fno-unwind-tables \
		 -fno-asynchronous-unwind-tables \
		 -DNDEBUG

SOURCES = main.c

OBJECTS = $(SOURCES:.c=.o)

all: $(TARGET)

$(TARGET): $(OBJECTS)
	$(CC) $(CFLAGS) -o $@ $^

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -f $(OBJECTS) $(TARGET)

.PHONY: all clean

Uso

Você pode rodar o programa na linha de comando como no exemplo abaixo:

./internet_time -t -3

Ou adicionar ao seu tmux.conf para exibir a hora decimal no seu tmux:

set-option -ag status-right ' #[fg=white,bg=default]#(internet_time -t -3 -f "時の%%.f")'

Para melhorar minha pronuncia em japonês, também posso usar o comando say para falar a hora decimal (no macOS):

say -v 'Kyoko (Enhanced)' `internet_time -l -f '時の%.f'`

Conclusão

É divertido pensar em outras formas de fazer coisas tão estabelecidas no nosso dia a dia como contar a passagem do tempo e experimentar as alternativas. Sem falar que é uma brincadeira que não tem mais fim, podia adotar o dia Juliano para acompanhar meu relógio decimal, por exemplo. E agora meu tmux parece muito mais Cyberpunk.

O código-fonte também esta disponível no GitHub.

Cesar Gimenes

Última modificação