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.