2010-05-23 4 views
17

Я хочу знать текущую дату и время.Java - Как получить текущую дату независимо от системной даты?

Код

Calendar.getInstance(); 

представляет дату и время системы, на которой запущена программа и системная дата может быть неправильной.

Так есть ли способ, с помощью которого я могу получить правильную текущую дату и время независимо от даты и времени системы, на которой запущена программа?

+2

Дата - относительная вещь ... Нет такой вещи, как «правильная текущая дата», если вы не обращаетесь к определенному часовому поясу. –

+0

ok .. как я могу получить правильную дату и время определенного часового пояса? –

+0

Вы должны начать с даты и времени вашей текущей системы - это нормально? – Mark

ответ

4

Если вы находитесь в Интернете, вы можете попросить известного и надежного источника времени. Если человек, запускающий вашу программу, хочет помешать вашей программе сделать это (например, если вы предоставили им ограниченную по времени лицензию, и они не хотят платить больше времени), они могут обманывать или блокировать это соединение.

В одном проекте, в котором я был, мы поставили надежный и надежный источник времени на аппаратное обеспечение, которое невозможно было подделать. Он был разработан для шифрования и лицензирования и имел библиотеку Java для доступа к ней. Извините, я не могу вспомнить имя устройства.

Таким образом, ответ может быть да, возможно, нет.

0

Методы уровня программирования разработаны для получения даты и времени из вашей системы. Вы не можете изменять их для получения дат, кроме указанной в Системе.

Для вашего дополнительного требования, если вы действительно хотите его использовать, вам потребуется синхронизация между вашей клиентской машиной и сервером.

3

Есть ли у вас системный доступ в Интернет? Если это так, вы можете использовать синхронизацию с точными службами времени (например: http://tldp.org/HOWTO/TimePrecision-HOWTO/ntp.html) и предоставить их вам.

7

Я совершенно не понимаю ваш вопрос, но я могу ответить на ваш титул:

GregorianCalendar gc = new GregorianCalendar(System.getCurrentTimeMillis()); 
int year = gc.get(Calendar.YEAR); 
39

В версиях Java До 1.1 это стандарт использовать Date класс:

Date now = new Date();  // Gets the current date and time 
int year = now.getYear(); // Returns the # of years since 1900 

Однако , в новых версиях Java большая часть класса Date устарела (в частности, метод getYear). Теперь больше стандартного использовать Calendar класс:

Calendar now = Calendar.getInstance(); // Gets the current date and time 
int year = now.get(Calendar.YEAR);  // The current year 
+4

Wow, 29 upvotes, и он не отвечает на вопрос, который специально спросил, как получить реальную дату, когда системные часы ошибочны. –

+0

@Paul Tomblin Исходное название этого вопроса: «Java - Как получить текущий год?» что не соответствует реальному вопросу. Изменено это. – ltlBeBoy

+0

@ltlBeBoy Я думаю, это слишком много, чтобы ожидать, что ответчики и активисты вопросов будут читать больше, чем заголовок. –

0

Вот некоторый код для извлечения даты в формате HTTP (обычно UTC часовой пояс) с веб-сервера на ваш выбор.

Конечно, если у вас нет контроля над физическим оборудованием и ОС, ничто не может гарантировать, что вы сможете поговорить с фактическим веб-сервером, который вы просите ... но в любом случае.

package some.package; 

import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.List; 
import java.util.Map; 

public class Test { 

    private static String getServerHttpDate(String serverUrl) throws IOException { 
    URL url = new URL(serverUrl); 
    URLConnection connection = url.openConnection(); 

    Map<String, List<String>> httpHeaders = connection.getHeaderFields(); 

    for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) { 
     String headerName = entry.getKey(); 
     if (headerName != null && headerName.equalsIgnoreCase("date")) { 
     return entry.getValue().get(0); 
     } 
    } 
    return null; 
    } 

    public static void main(String[] args) throws IOException { 
    String serverUrl = args.length > 0 ? args[0] : "https://google.com"; 
    System.out.println(getServerHttpDate(serverUrl)); 
    } 

} 
Смежные вопросы