Estoy tratando de hacer una aplicación falsa de tiempo métrico para hacerle una broma a algunos amigos cuando hagamos un viaje a Canadá pronto y me gustaría saber cómo podría hacer que esto funcione conceptualmente.
Ya sé que el tiempo ya se considera "métrico", pero para que esta broma funcione, el prank-ee debe creer que no lo es.
Entonces, si asumimos que "tiempo regular" significa la escala de tiempo que todos en el mundo usan (24 horas en un día, 60 segundos en un minuto, 60 minutos en una hora, etc.), entonces ¿cómo lo haría de alguna manera? vincular el "tiempo regular" con el "tiempo métrico" (100 horas en un día, 100 segundos en un minuto, 100 minutos en una hora) para crear un reloj de tiempo métrico creíble.
(por creíble me refiero a no hacer que los segundos pasen demasiado rápido para compensar los 913.600 segundos extra del día)
En pocas palabras,
quiero hacer de alguna manera una escala de tiempo creíble basada en potencias de 10 que podría reemplazar de manera factible nuestro sistema de cronometraje actual, sin dejar de estar vinculado a nuestra escala de tiempo actual (por lo que el "tiempo métrico" de las 80:00 a. m. caería al mismo tiempo todos los días).
Puntos de bonificación si puede explicar una forma realista de hacer esto donde cada incremento (es decir, segundos en un minuto, minutos en una hora, etc.) es el mismo.
Puntos de bonificación adicionales si alguien puede proponer una solución en la que no tenga que implementar un salto de tiempo masivo a la medianoche para que los tiempos se correlacionen.
Entiendo que este puede no ser el mejor lugar para hacer esta pregunta, pero como no estoy preguntando cómo implementar esto en el código, sino cómo funcionaría el concepto . Por lo tanto, pensé que este sería el mejor lugar para preguntar.
En unidades imperiales, una milla se divide en yardas, pies y pulgadas (como los días se dividen en horas, minutos y segundos). Sin embargo, en el sistema métrico las subunidades se basan en potencias de diez y se nombran con prefijos: el kilómetro se divide en metros, centímetros , milímetros , etc.
Para un sistema de tiempo métrico, aplicaría el mismo concepto a la unidad base de un día. En lugar de horas y minutos, tendría subunidades como centidays y millidays.
Por ejemplo, 10:18:42 pm
sería igual a:
(De donde proviene el medio día adicional pm
).
Las subdivisiones del día serían:
Para divertirte, puedes inventar apodos para las diferentes unidades. Por ejemplo, deciday podría ser "hora métrica", "deci" o (basado en la abreviatura dd
) un "fracaso". Milliday podría ser "minuto métrico" o "medio".
Podríamos agregar una "unidad de conveniencia" adicional también basada en las potencias de diez:
Así que podríamos escribir nuestro tiempo desde antes ( 10:18:42 pm
) en tiempo métrico como:
O simplemente como 9:29:65
o incluso 0.92965
.
Esto también facilita la representación de fechas, ya que podemos poner un número entero de días delante del punto decimal. De hecho, podríamos descartar los meses por completo y solo usar números de días. Por ejemplo, hoy es 2016-02-11
(11 de febrero de 2016). Enero tiene 31 días, por lo que el 1 de febrero es el día 32 y el 11 de febrero es el día 42. Por lo tanto, en el calendario métrico hoy es el "día 42 de 2016".
Poniéndolo todo junto, 10:18:42 pm, Feb 11, 2016
es 42.9:29:65, 2016
.
Bromas aparte, esto es parecido a un sistema en tiempo real: la fecha juliana . Hay muchas variantes, pero todas cuentan días decimales desde algún punto de partida.
Usemos la misma fecha anterior como ejemplo. En la fecha juliana "tradicional", 2016-02-11T22:18:42
es igual a JD 2457430.429653
. Tenga en cuenta que la parte decimal es casi la misma, pero hay una diferencia de 0.5
. La fecha juliana comienza al mediodía, no a la medianoche, fue inventada por los astrónomos, y de esta manera no se da la vuelta en medio de la noche cuando están haciendo sus observaciones. Tenga en cuenta también que asumí que nuestra hora estaba en GMT: no existe un concepto de zonas horarias para la fecha juliana, por lo que debemos convertir la hora a GMT antes de convertirla a JD.
También existe la fecha juliana "modificada", definida como MJD = JD − 2400000.5
. Nuestro tiempo de ejemplo es MJD 57429.929653
. La fecha juliana modificada se usa con frecuencia en la industria espacial porque es más corta que la fecha juliana completa (y más fácil de representar en computadoras con precisión limitada) y comienza a la medianoche como la mayoría de los otros sistemas de tiempo (de donde proviene el factor de) 0.5
.
Dato curioso: las "fechas estelares" de Star Trek se basaron en el concepto de la fecha juliana.
Un último punto: mencioné las zonas horarias en la sección anterior, y para un país grande como Canadá, las zonas horarias son prácticamente una necesidad (aunque China parece estar bien sin ellas). Hay dos opciones:
Base la hora métrica en la hora local real. Entonces, si estás en Ottowa (EST/UTC-5) y los relojes locales dicen 10:18 pm
, entonces tu reloj métrico diría 9:29
. A la misma hora en Vancouver (PST/UTC-8), los relojes locales dicen 7:18 pm
y su reloj métrico diría 8:04
. Este es el más fácil de implementar, ya que solo puede hacer el cálculo en función de la hora local del teléfono, que generalmente es lo que obtiene de las funciones de fecha integradas de manera predeterminada. Las diferencias entre las zonas horarias no son un número entero de fallas o medios, pero ese es el tipo de cosas extrañas y estúpidas que suceden en la vida real.
¡Crea tus propias zonas horarias! Esto hace que la lógica de la aplicación no sea trivial y probablemente esté demasiado lejos para una aplicación de broma; pero me gusta pensar en este tipo de cosas, así que aquí va.
Si nos restringimos a las compensaciones de zona horaria de fallas completas, entonces solo hay diez zonas horarias en el mundo, cada una de aproximadamente 36 grados de ancho. Canadá es lo suficientemente ancho como para tener tres de ellos (por lo que hay una diferencia de dos fallas entre las zonas horarias del este y del oeste). Para hacer las cosas plausibles, haré las zonas horarias métricas fusionando las zonas horarias reales para hacer nuestras vidas un poco más fáciles.
La +0
zona horaria se centra en 0 grados de longitud. Las líneas divisorias "ideales" serían 18 grados a cada lado, por lo que el borde occidental (que divide las zonas horarias +0
y -1
) atraviesa Islandia. La -1
zona horaria tiene 36 grados de ancho e incluye la mayor parte de Groenlandia, justo atravesando el extremo este de Canadá. La -2
zona horaria incluye la mayor parte de los Grandes Lagos, deteniéndose justo antes del extremo oeste del Lago Superior. La -3
zona horaria contiene Alberta, Saskatchewan y Manitoba. Termina justo después de la costa oeste de los Estados Unidos. La -4
zona horaria incluye la mitad oeste de la Columbia Británica y el Yukón.
Estas divisiones ideales en realidad se alinean bastante bien con las zonas horarias existentes. La nueva -2
zona horaria se alinea con UTC-4
(hora del Atlántico) y UTC-5
(hora del Este). El nuevo -3
incluye UTC-6
(hora central) y UTC-7
(hora de la montaña). Finalmente, la nueva -4
zona horaria incluye UTC-8
(hora del Pacífico), así como UTC-9
(hora de Alaska). Puede llamar a las nuevas zonas horarias "Eastern Metric Time", "Central Metric Time" y "Pacific Metric Time" (con las abreviaturas EMT, CMT y PMT).
Para la implementación real, obtendría la hora UTC actual de las bibliotecas de fechas y la convertiría a hora métrica. A continuación, busque el desplazamiento UTC actual del usuario y asígnelo a una de las nuevas zonas horarias (todos los casos anteriores son solo newTZ = floor(oldTZ / 2)
), luego sume o reste esa cantidad de fallas de la hora métrica. Los límites cambiarían durante el horario de verano (por ejemplo, las ubicaciones que usan PDT se mueven a la -3
zona horaria y las ubicaciones en CDT se mueven a la -2
zona horaria), pero podemos vivir con eso. El floor(TZ / 2)
truco parece funcionar razonablemente bien en el resto del mundo también.
.92965
en su ejemplo) a 9 dd 29 md 65.3 sm
?deciday = (int)(day * 10); milliday = (int)(day * 1000) % 100; msec = (int)(day * 100000) % 100;
floor
función en su lugar.El método que siempre he usado es 10 horas por día, 100 minutos por hora, 100 segundos por minuto, como sugiere 2012rcampion.
Entonces hay horas normales por hora métrica, minutos normales por minuto métrico, y segundos por segundo métrico.
Si está construyendo su propio reloj en un microcontrolador o usando dispositivos electrónicos pequeños, querrá actualizar el segundo métrico cada 864 milisegundos normales.
Si solo está escribiendo software en una computadora portátil o dispositivo móvil que tiene acceso simple a las funciones de tiempo normales, entonces puede obtener la hora actual del día en segundos.
Usé Visual Basic.Net, hice un par de etiquetas, dos cuadros de texto y un temporizador configurado para actualizarse cada 50 milisegundos (aunque podría hacerlo con menos frecuencia, especialmente si no muestra las dos veces seguidas).
Aquí está el código VB.Net usando VS 2013. Cree un nuevo proyecto de formularios, cree un cuadro de texto llamado txtNormal
, otro llamado txtMetric
, un temporizador llamado, timClock
luego pegue el código en el archivo de clase y debería funcionar.
Private Sub timClock_Tick(sender As Object, e As EventArgs) Handles timClock.Tick Dim Now As Date = DateTime.Now Dim normalSeconds As Integer = Now.Second Dim normalMinutes As Integer = Now.Minute Dim normalHours As Integer = Now.Hour Dim totalSeconds As Double Dim metricSeconds As Double Dim metricMinutes As Integer Dim metricHours As Integer totalSeconds = Now.TimeOfDay.TotalSeconds metricSeconds = 100000 * totalSeconds / 86400 metricHours = Math.Floor(metricSeconds / 10000) metricSeconds -= metricHours * 10000 metricMinutes = Math.Floor(metricSeconds / 100) metricSeconds -= metricMinutes * 100 metricSeconds = Math.Floor(metricSeconds) txtNormal.Text = normalHours.ToString("00") + ":" + normalMinutes.ToString("00") + ":" + normalSeconds.ToString("00") txtMetric.Text = metricHours.ToString("00") + ":" + metricMinutes.ToString("00") + ":" + metricSeconds.ToString("00") End Sub
Aquí hay varias capturas de pantalla de un programa simple que se ejecuta con diferentes zonas horarias:
Si quiere ir más allá, puede convertir semanas en períodos de 10 días, con 36,5 semanas por año, aunque obviamente no hay forma de convertir completamente a un calendario métrico de base 10 sin ajustar la rotación de la Tierra.
Cabe destacar que Francia usó este sistema de tiempo exacto desde 1794 hasta al menos 1801, aunque solo fue obligatorio hasta 1795, y usaron una semana de 10 días desde 1800 hasta 1805. En su sistema, el reloj y las unidades se llamaban "decimal". " en lugar de "métrico", aunque introdujeron el sistema métrico al mismo tiempo, y en ocasiones usaban la unidad "décime", una décima de hora decimal o diez minutos decimales. Durante esta era, el astrónomo Pierre-Simon Laplace usó un reloj decimal que terminó siendo la base para que los astrónomos usaran el tiempo decimal que 2012rcampion menciona en su respuesta.
Voy a indicarle una solución existente, que es algo similar a lo que sugiere, pero no estoy seguro de si esto es lo que desea. Hackworth también lo ha mencionado en un comentario.
Hay un sistema de tiempo llamado Swatch Internet Time . Esto fue inventado por Swatch (de ahí el nombre).
El día se divide en 1000 latidos. Eso hace que un latido dure alrededor de 1 minuto y 26 segundos. Por lo tanto, 500 latidos serían el mediodía, 250 latidos las 6 a. m., etc. (El reloj no tiene zonas horarias, por lo que esos tiempos serían UTC+1, pero, por supuesto, podría ignorarlo para su propósito. Hay un convertidor en el sitio web de Swatch )
Lo que hace que esto sea genial en mi opinión es que 1 segundo corresponde a 0.011574 .beats, que es casi 0.01. Entonces, si crea un reloj o una aplicación, el cambio en este decimal será prácticamente indistinguible de los segundos. Entonces podría tener un indicador para este segundo decimal y 'marcará' tan rápido como un segundo indicador en un reloj normal.
Xandar El Zenón
DesarrolladorACE
T3 H40
usuario253751
Hackworth
JFBM
miguels
Hacedor de sirenas
DesarrolladorACE
Hacedor de sirenas
DesarrolladorACE
jamesqf