Java: Obtenga la fecha y hora actuales del servidor, no del reloj del sistema

En mi progtwig Java, necesito crear una instancia del momento actual en el tiempo. yo suelo

Date date = new Date(); 

Esto me da la fecha y hora actuales según el reloj del sistema de la máquina host. ¿Hay alguna manera de obtener la fecha y hora actual de un servidor en línea? El servidor del tiempo mundial tal vez?

He visto esta publicación y describe lo que quiero, pero me temo que necesito más ayuda de la que se proporciona allí.

En pocas palabras, quiero obtener una fecha y una hora que no dependan del reloj del sistema de la máquina host.

¡Gracias!

Puede echar un vistazo a la demostración del Cliente Java NTP disponible en

http://www.docjar.com/html/api/examples/ntp/NTPClient.java.html

y algún código de ejemplo que utiliza este cliente

http://www.docjar.com/html/api/examples/ntp/TimeClient.java.html

Se trata de 170 líneas de código Java bien documentado.

Red local

Si su máquina está conectada a una red local, conéctese a alguna máquina que funcione como un servidor de tiempo confiable. Podrías escribir tu propio servidor de tiempo.

Protocolo de tiempo de red

O bien, podría utilizar el bien gastado Network Time Protocol (NTP) con las implementaciones existentes de servidor y cliente integradas con la mayoría de los sistemas operativos . Para más información sobre esto, vea la Respuesta aceptada por aioobe .

Considere colocar esa computadora servidor de tiempo en la zona desmilitarizada de la red para actualizaciones de servidores de tiempo en Internet, como el proyecto pool.ntp.org o los proporcionados por el gobierno federal de los Estados Unidos (NIST) .

Internet

Si su máquina está conectada a los internets, conéctese a un servidor de tiempo confiable. Como se discutió anteriormente, use un protocolo personalizado, como un servicio web, o use NTP .

Esto se discute en la Pregunta, cómo hacer que mi aplicación java obtenga tiempo global a partir de algún reloj en línea .

Consulte también Preguntas: Cliente Java NTP y cliente Java para servidor de tiempo, como Network Time Protocol (NTP) .

Radio reloj

Obtenga un reloj de radio con una conexión USB para la salida de la hora actual sincronizada por un código de tiempo transmitido por un transmisor de radio conectado a un estándar de tiempo como un reloj atómico. Los transmisores están transmitiendo en muchos países de todo el mundo.

La compañía Meinberg Global , al menos, ofrece varios de estos dispositivos .

foto de un par de dispositivos externos de reloj de radio

GPS

Similar a los relojes de radio anteriores, un receptor de señales de GPS ( Sistema de Posicionamiento Global ) también podría capturar y transmitir la señal de tiempo . O tal vez GALILEO , GLONASS u otro servicio de Radionavegación por satélite .

Reloj de sol

Coloque un reloj de sol fuera de una ventana. Adjunte una cámara web a la computadora en cuestión. Coloque la cámara web en la ventana. Escribe una aplicación para interpretar la hora del día a partir de la imagen actual del reloj de sol.

foto de un reloj de sol sobre un pedestal en un jardín

Advertencia: esta solución no funciona en Seattle .


java.time.Clock

Para aprovechar cualquiera de estos proveedores del momento actual, escriba una subclase de la clase abstracta java.time.Clock .

Puede pasar su implementación de Clock como argumento a los diversos métodos de java.time . Por ejemplo, Instant.now( clock ) .

 Instant instant = Instant.now( yourClockGoesHere ) ; 

Para fines de prueba, tenga en cuenta las implementaciones alternativas de Clock disponibles estáticamente desde el Clock : fixed , offset , tick y más.

Evite las clases heredadas de fecha y hora de las primeras versiones de Java, como Date y Calendar . Estas clases problemáticas son completamente suplantadas por las clases java.time .


Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Normalmente los servidores sincronizan su tiempo regularmente con servidores de tiempo en línea. Por lo tanto, la hora de su servidor debe ser precisa. Si no, contacta a tu administrador.

Para obtener, por ejemplo, la hora GMT, use las clases Calendar y TimeZone.