Не могли бы вы сказать мне время? [закрыто]


55

Вы знаете, что API часов / времени вашего языка сломаны, и они совсем не надежны.

Таким образом, вам не разрешается использовать какой-либо встроенный API для доступа к системному времени / дате.

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

Напишите программу, которая печатает текущую дату / время без вызова API даты / времени / часов. Например DateTime.Now, GetDate()и подобные функции не допускаются.

Ответ с большинством голосов побед.

В случае ничьей, ответ с большей точностью выигрывает (то есть с точностью до секунд, затем миллисекунд, затем микросекунд и т. Д.).


2
Другими словами, поговорить с сервером времени?
Питер Тейлор

3
Да, вы можете сделать это. Одно из возможных решений.
микробиан

3
Скорее неопределенный вопрос. Я думаю, что большинство голосов будет набрано, как ответ print(input("Please enter the current time")).
Говард

7
Мои деньги идут на «Загрузите REPL для другого языка и вызовите его API без прерывания по времени».
Джонатан Ван Матре

2
@ это тоже не разрешено. Потому что ваш ответ станет ненадежным.
микробиан

Ответы:


121

Ява

Практически во всех современных решениях предполагается, что локальный / удаленный компьютер не лжет о текущем времени (вы также поверите T-600?).
Ключевым моментом при расчете времени является доверие к чистой природе .
Это приложение для Android просит пользователя сфотографировать небо и прогнозирует текущее время с невероятной точностью:

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
   if (resultCode == RESULT_OK) 
   {
      Uri selectedImageUri = data.getData();
      this.imageView.setImageURI(selectedImageUri);

      TimeGuesser guesser = new TimeGuesser(this);
      String result = guesser.guessTimeFromImage(selectedImageUri);
      this.textView.setText(result);   
   }
}

public class TimeGuesser {

    private Context context;
    public TimeGuesser(Context context)
    {
        super();
        this.context = context;
    }

    public String guessTimeFromImage(Uri uri) {
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.context.getContentResolver(), uri);
        } catch (IOException e) {
            return "There is no sky. Everyone's going to die";
        }

        float brightness = getBrightness(bitmap);

        if (brightness < 90.0)
        {
            return "It's sooo late";
        } else {
            return "It's sooo early";
        }
    }

    private float getBrightness(Bitmap bitmap)
    {
        float R, G, B;
        R = G = B = 0.0f;
        int pixelColor;
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int size = width * height;

        for (int x = 0; x < width; ++x) {
            for (int y = 0; y < height; ++y) {
                pixelColor = bitmap.getPixel(x, y);
                R += Color.red(pixelColor);
                G += Color.green(pixelColor);
                B += Color.blue(pixelColor);
            }
        }

        R /= size;
        G /= size;
        B /= size;

        float brightness =  (0.2126f*R ) + (0.7152f*G) + (0.0722f*B);
        return brightness;
    }
}

Результаты:

введите описание изображения здесь


введите описание изображения здесь


49
+1 для "There is no sky. Everyone's going to die": D
дверная ручка

6
«Все умрут - или ваш палец находится над камерой. По сути, одно и то же».
CorsiKa

Пожалуйста, укажите Java
user1886419

3
Это определенно мой любимый, я просто надеюсь, что это не сводится к тай-брейку ...
Dryden Long

21
Что насчет Затмений? Они могут вызвать здесь столько же проблем, сколько и во время разработки Java!
пока

64

Рубин

Давайте будем честными: время меняется только когда что-то публикуется на stackoverflow.com ;)

Скрипт извлекает время метки «XYs ago» в самом верхнем вопросе.

require 'net/http'
source = Net::HTTP.get('stackoverflow.com', '/')

puts source.match(/span title=\"(.*)\" class=\"relativetime/)[1]

Выход:

2014-03-10 18:40:05Z

2
Только с точностью до второго ... и второго, который ТАК пингует свое нтп .. позорное поклонение
Дэвид Уилкинс

3
<CENTER> НЕ МОЖЕТ ПРОВЕСТИ НЕ ПРИХОДИТ
дверная ручка

@ Doorknob Мне действительно нужно распечатать этот пост и повесить на стену.
wchargin

30

удар

Нравится? (требуется wgetи grep)

wget -qO- 'http://www.wolframalpha.com/input/?i=current+time'|grep ' am \| pm '

Вывод я получил несколько минут назад:

                    Why am I seeing this message? 
  context.jsonArray.popups.pod_0200.push( {"stringified": "6:08:38 pm GMT\/BST  |  Monday, March 10, 2014","mInput": "","mOutput": "", "popLinks": {} });

Или это? (требуется wgetи eog)

wget http://c.xkcd.com/redirect/comic/now
eog ./now
rm ./now

Выходные данные я получаю сейчас: (Изображение от xkcd )

карта мира с часовым поясом http://c.xkcd.com/redirect/comic/now


@tbodt Не уверен, что вы увидите этот комментарий. Ваше редактирование недействительно, потому что http://c.xkcd.com/redirect/comic/nowдает изображение, а http://xkcd.com/nowдает веб-страницу.
ace_HongKongIndependence

9
Я только что понял, что комикс отображает изменения в зависимости от времени суток. Это потрясающе.
RJFalconer

2
Жаль, что в мультфильме нет перехода на летнее время. (Например, на востоке США, когда я пишу это, всего четыре часа позади Великобритании, а не пять, как показано на карикатуре.) Более того, северное и южное полушария могут сдвинуться на два часа не синхронно.
Дэвид Ричерби

16
Я говорю +1 xkcd за то, что он не соблюдает переход на летнее время, и надеюсь, что остальной мир последует его примеру.
hoosierEE

29

SH / Coreutils

touch . && stat . -c %z

Выводит дату в несколько нестандартном формате:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
хотя, думаю, это может зависеть от локали.


1
Не работает Он говорит , что разрешение отказано :)
devnull

5
@devnull ваша файловая система ужасно сломана. Исправить это сcd $(mktemp -d)
mniip

Meh, время dir устанавливается с помощью библиотечной функции.
Навин

@ Навин Это не установлено. Каталог inode просто открыт для записи, и ядро ​​обновляет свой mtime. Там нет явного set mtime to thisсистемного вызова нигде
mniip

@mniip Welll, хорошо. Я все еще чувствую, что touchэто библиотечная функция / команда, поскольку она имеет желаемый побочный эффект.
Навин

25

PHP

Используйте тот факт, что uniqid()возвращает идентификатор на основе времени.

$u=hexdec(substr(uniqid(),0,8));

$y=floor($u/31536000);
$u-=$y*31536000;
$y+=1970;

$d=floor($u/86400);
$u-=$d*86400;

$h=floor($u/3600);
$u-=$h*3600;

$m=floor($u/60);

$s=$u-$m*60;

echo 'Year='.$y.' Days='.$d.' Hours='.$h.' Minutes='.$m.' Seconds='.$s;

Во время моего теста, он вернулся: Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49.
Я не знаю, могу ли я использовать dateдля правильного форматирования, поэтому я преобразовал его вручную.


2
Я уверен, что это нарушение правил ... uniqidвсе еще является частью вашего языка ... Но все же вы получаете +1
mniip

Почему ? да, uniqidиспользуйте низкоуровневый API времени, но даже когда вы запрашиваете время у внешнего сервера, где-то будет низкоуровневый API для вызова времени ...
Майкл М.

1
Я не говорю о времени вызовов API здесь. Я говорю, что это все еще часть языка.
14:30

2
@mniip да, но uniqid()был сломан еще до того, как был задан этот вопрос. в этом вопросе
ломаются

23

DNS

Разве мы не доверяем только своей машине? Если так, это считается?

ssh $othermachine date

Если это не считается, извлечение времени из обновления DNS определенно делает:

dig stackexchange.com | grep WHEN

23

удар

Просто чтобы быть всегда абсолютно точным и правильным:

echo "Now"

или мотивация:

echo "Now, do something useful today"

10
toady, существительное, множественное число toadies. Наговорчивый льстец; подхалим. ( Источник )
ace_HongKongIndependence

3
Нет absolutely precise, выполнение команды все равно займет немного времени.
user80551

2
@ user80551 И вот, если ты ошибаешься, то теперь всегда совершенно точно. Если вы посмотрите на часы, то время меняется до того, как изображение достигнет вашего глаза. Но сейчас, сейчас всегда сейчас.
Master117

10
@ user80551 echo "Then"работает для этого требования.
Темыр

2
-Какого черта я смотрю? Когда это происходит в программе? -В настоящее время! Вы смотрите на Сейчас, сэр, что бы ни происходило сейчас в программе, это происходит сейчас. -Что тогда добавить? Это прошло -Когда? -Только сейчас
ilmale

20

curl - с точностью до вашей скорости пинга

curl -s time.nist.gov:13

Хорошо, но это в UTC, разве не по местному времени?
Орион

24
@orion Разве мы не локальны во вселенной?
Pureferret

Это один из 2 серверов по умолчанию, который Windows использует для синхронизации времени.
Исмаэль Мигель

@IsmaelMiguel также используется многими нестандартными системами ..
Дэвид Уилкинс,

Я просто сказал. Я не говорю, что это единственное место, где оно используется. Я просто говорю факт.
Исмаэль Мигель


13

Python 2

Итак, часы правильные, но API времени скрыт, верно? Почему бы не проверить временную метку необработанной файловой системы. Вместо того, чтобы создавать тестовый файл, мы просто используем нашу собственную временную метку доступа, так как скрипт должен быть прочитан для запуска (даже если он был скомпилирован). Точно ко второму. *

import os
h, m = divmod(os.stat('t.py').st_atime % 86400, 3600)
print h+1, m // 60, m % 60

Это следует сохранить и запустить как t.py. Альтернативно, получите имя скрипта во время выполнения сinspect.getfile(inspect.currentframe())

Примечание * Иногда с точностью до предыдущей секунды.


Должны ли мы проверить t.pycили t.pyoвместо этого?
Кайл Келли

1
Хорошая мысль, но они не будут существовать, если вы не импортируете этот файл как модуль (или создадите их вручную). Во всяком случае, я проверил, и Python (2.7.2 на OS X) будет касаться .pyфайла, даже если соответствующий .pycприсутствует. Так что это всегда работает правильно.
Алексис

Отметили и проголосовали. Красиво сделано.
Кайл Келли

10

Рубин

HTTP, но только с использованием метаданных ответа.

require 'uri'
require 'net/http'

def get_now
  uri = URI.parse("http://google.com")
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  rsp = http.request(request)
  rsp['date']
end

9

п.с.

Не можете psсказать время? Может!

sleep 1&  ps -o lstart -p $!

Процесс запускается в фоновом режиме и psсообщает время начала процесса. Поскольку процесс начался в фоновом режиме, время начала процесса практически такое же, как и сейчас.

Кроме того, преимущество заключается в том, что время получается в местном часовом поясе. И вам не нужно подключение к интернету!


7

УВА

потому что я не должен.

Public Function DateTime() As String
Dim myNTPsvr As String
Dim dattime As String
Dim oHTTP As Object

myNTPsvr = "time.windows.com"
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://" & myNTPsvr & "/", False
oHTTP.Send

DateTime = oHTTP.GetResponseHeader("Date")

Set oHTTP = Nothing
End Function

использовать ?DateTimeдля использования, или если вы положите его в Excel, то =DateTime()будет работать как формула.
Дата / время возвращаются в GMT - я оставляю это как бесполезное упражнение, чтобы преобразовать его из строки в местное время


6

Баш + last+ head+cut

Точно ко второму. lastиспользует файл журнала/var/log/wtmp

$ last -RF reboot | head -n1 | cut -c50-73
Tue Mar 11 09:38:53 2014
$ 

РЕДАКТИРОВАТЬ: Добавлено, headчтобы ограничить только одной строкой.

РЕДАКТИРОВАТЬ: Это работает на Linux Mint 13 Cinnamon 64-bit, но кажется, что это зависит от вашего дистрибутива. sysvinit-utils(которая обеспечивает last) версия 2.88dsf-13.10ubuntu11.1 lastсчитывается из /var/log/wtmp(в моем случае), поэтому результаты зависят от этого файла журнала. Смотрите комментарии ниже.

РЕДАКТИРОВАТЬ: Очевидно, это зависит от времени работы системы, поэтому вы можете увидеть доказательство здесь http://imgur.com/pqGGPmE


Это возвращает пустую строку здесь. И я не уверен, что что-то релевантное может быть извлечено оттуда, поскольку человек lastговорит: «Псевдопользователь перезагружает журналы при каждой перезагрузке системы». (И даже здесь это не кажется правильным: pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA На самом деле -Fпечатает полное время входа и выхода из системы . Поскольку текущий пользователь все еще вошел в систему, время выхода из системы является текущим временем. Это на Linux Mint 13 cinnamon 64 bit. Это может зависеть от локали, но я сомневаюсь в этом.
user80551


2
Разбит на арке (системный). Возвращает «все еще работает».
Орион

5
На самом деле, «все еще работает», по крайней мере, философски правильное время.
Орион

5

питон

Получить точность наносекунды было бы непросто, если только возвращаемое время не было основано на завершении программы, а не на ее запуске. Имея это в виду, имеет больше смысла рассчитывать время на основе, когда программа заканчивается. Это означает, что мы должны контролировать, когда программа останавливается, чтобы получить дополнительную точность.

import subprocess

def what_day_is_it(): return int(subprocess.check_output(["date", "+%dd"]))[:-2];

current_day = next_day = what_day_is_it # It's a bash call, 
while not current_day - next_day:
  next_day = what_day_is_it()
print "It's midnight."
print "Probably."

Обратите внимание, что предполагается, что либо когда часы Python работают, либо нет, либо часы Bash, по крайней мере, знают, какой сегодня день. Если нет, мы можем вместо этого использовать это:

def what_year_is_it(): return int(subprocess.check_output(["date", "+%yy"]))[:-2];

Может быть немного медленнее, хотя. Я не проверял это.


5

Brainfuck

>+++++++[-<++++++++>]<---.>+++++[-<+++++>]<++.---.>++++++++[-<-------->]<---.

Выход:

5PM

Я думаю, что он отображает время в Денвере на момент написания. Объяснение алгоритма здесь на этом видео Алана Джексона .


xkcd.com/221 но на время вижу.
вал

@val Они оба имеют свойство, которое стало постоянным во время выполнения, но песня правильная. Это где-то 5 вечера. XKCD часто случается, так как новые разработчики считают, что вычисления во время расширения макросов экономят время.
Сильвестр

Но это действительно экономит время! В результате исполняемый файл на самом деле.
вал

5

Рубин

`date`

Не использует API часов / времени языка.


Что именно это делает?
Hosch250

1
Выполняет команду date в оболочке и возвращает вывод.
bblack

4

Мне понравилась идея «чтение с сервера времени». Хотя улучшено его форматирование и добавлено несколько городов для развлечения.

PHP

$page = file_get_contents("http://www.timeapi.org/utc/now");
echo "In London: ".date("H:i:s - jS F, Y", strtotime($page))."<br>";
echo "In Rome: ".date("H:i:s - jS F, Y", strtotime($page)+3600)."<br>";
echo "In Athens: ".date("H:i:s - jS F, Y", strtotime($page)+7200)."<br>";

4

удар

echo "It's eight o'clock."

Благодаря The Goon Show . (Кроме того, это правильно два раза в день!)



1
@squeamishossifrage Хорошая мысль. Так что, если дело доходит до тай-брейка, у меня есть 18-минутная точность! ;-)
Дэвид Ричерби


4

С / WinAPI

Это делает предположение, что мои собственные вызовы API для запроса часов не работают, но сама система может корректно работать со временем.

// NO ERROR CHECKING - that's left as an exercise for the reader
TCHAR tmpfilename[MAX_PATH];
TCHAR tmpfilepath[MAX_PATH];

// get some information to create a temporary file
DWORD dwRes = GetTempPath(MAX_PATH, tmpfilepath);
UINT uiRes  = GetTempFileName(tmpfilepath, TEXT("golftime"), 0, tmpfilename);

// create the file
HANDLE hTempFile = CreateFile(tmpfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

// read the creation time of the file. accuracy is to, uhm... 10ms on NTFS?
FILETIME created;
GetFileTime(hTempFile, &created, NULL, NULL);

// convert the filetime to a system time (in UTC)
SYSTEMTIME systime;
FileTimeToSystemTime(&created, &systime);

std::cout << "Time is " <<
    systime.wHour << ":" << systime.wMinute << ":" << systime.wSecond << "." << systime.wMilliseconds << "\n";

// close the file and delete
CloseHandle(hTempFile);
DeleteFile(tmpfilename);

Идея состоит в том, чтобы создать временный файл и прочитать время создания, которое в NTFS, я думаю, точно до 10 мс. Обратите внимание, что форматирование вывода сомнительно, но это просто, потому что я ленивый.

Вывод на мою машину только сейчас: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader- Я лучше не вижу этого в производственном коде
wchargin

4

партия

@echo off
echo.>>%0
for /f "tokens=2,3 skip=4" %%a in ('dir /TW %0') do echo %%a %%b & goto :EOF

Записывает пустую строку в пакетный файл (сам), затем проверяет время последней записи файла.

H:\uprof>GetTime.bat
09:28 AM

H:\uprof>GetTime.bat
09:29 AM

3

HTML, CSS и Javascript / jQuery

Итак, я знаю, что технически это не программа и, вероятно, выходит за рамки критериев, но всего через несколько часов это будут самые точные часы в мире!

CSS

@font-face {
    font-family:"DSDIGI";
    src:url("http://fontsforweb.com/public/fonts/1091/DSDIGI.eot") format("eot"),
    url("http://fontsforweb.com/public/fonts/1091/DSDIGI.ttf") format("truetype");
    font-weight:normal;
    font-style:normal;
}
#backer {
    background-image: url('http://i.imgur.com/w3W5TPd.jpg');
    width: 450px;
    height: 354px;
    color: red;
    font-family: 'DSDIGI';
}
#backer p {
    width: 100%;
    display: block;
    line-height: 325px;
    font-size: 60px;
}

HTML

<div id="backer">
    <p>
        BEER<span id="fade">:</span>30
    </p>
</div>

JQuery

function start() {
    $('#fade').fadeOut(function() {
        $('#fade').fadeIn();
    });
    setTimeout(start, 1000);
}
start();

Сначала я собирался сделать while(true)цикл, но потом вспомнил, что я не хочу сбивать браузеры ...

Вот скрипка в действии: http://jsfiddle.net/E7Egu/

введите описание изображения здесь


4
flare_points ++;
Scunliffe

Мне нравится, что 2 года спустя кто-то приходит и голосует против этого ... LOL
Драйден Лонг

3

Emacs Lisp

Google вещь была сделана, но не в Emacs!

(url-retrieve "http://www.google.com/search?q=time" (lambda(l)            
        (search-forward-regexp "[0-9]?[0-9]:[0-9][0-9][ap]m")
        (print (buffer-substring (point) (1+ (search-backward ">"))))))

2

node.js / Javascript

var fs = require('fs'),
    util = require('util');

var date = null, time = null;

fs.readFile('/sys/class/rtc/rtc0/date', 'UTF-8', function(err, d) {
    date = d.trim();
    if(time)
        done();
})

fs.readFile('/sys/class/rtc/rtc0/time', 'UTF-8', function(err, t) {
    time = t.trim();
    if(date)
        done();
});

function done() {
    console.log(util.format('%sT%sZ', date, time));
}

1
пропустил несколько зависимостей там. Что это за вкус Linux?
Не то, чтобы Чарльз

1
Чего не хватает в каталоге / sys / class / rtc / rct0? Я на Arch Linux.
Крис

1
да, этого нет во всех * nix системах, а тем более во всех системах!
Не то чтобы Чарльз

1

JavaScript

new Date(performance.timing.navigationStart+performance.now())+''

Поскольку API часов / времени не работает, я использую Performance API, чтобы получить время. Затем Dateиспользуется только для анализа строки.


2
Не уверен, что это соответствует правилам :)
Oriol

Этот API имеет ужасную поддержку.
Исмаэль Мигель

1

PHP:

 $n=PHP_SHLIB_SUFFIX=='dll'?strtotime(str_replace(PHP_EOL,' ',`date /t&time /t`).' GMT'):`date +%s`;

Это будет считывать системное время из доступного интерфейса командной строки.

Оператор backtick используется для этого: запустить команду.

Другой способ будет:

$_SERVER['REQUEST_TIME'];

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


Разве это все еще не зависит от вашей собственной системы на время?
Морис

2
1-я строка вопроса : «Вы знаете, что API часов / времени вашего языка сломаны и совсем не надежны». Я думаю, что это само собой объясняется.
Исмаэль Мигель

1

удар

export PS1="(\t) $PS1"

Немного обходит правила, но это никогда не вызывает функцию времени. Он будет отображать текущее время при выходе, и каждый раз, когда вы нажимаете ввод, после этого.


1

C #

Этот сверхточный метод будет работать - при условии, что вы запустите программу в 0: 00: 00,0000

using System;
using System.Threading;

namespace ConsoleApplication1 {
  class Program {
    private static volatile int s_Hour;
    private static volatile int s_Minute;
    private static volatile int s_Second;
    private static volatile int s_Millisecond;

    class Looper {
      public int Length { get; set; }
      public Action Update { get; set; }
    }

    static void Loop(object args) {
      var looper = (Looper)args;
      while (true) {
        Thread.Sleep(looper.Length);
        looper.Update.Invoke();
      }
    }

    static void Main(string[] args) {
      var starter = new ParameterizedThreadStart(Loop);
      new Thread(starter).Start(new Looper { Length = 100, Update = () => { s_Millisecond = (s_Millisecond + 100) % 1000; } });
      new Thread(starter).Start(new Looper { Length = 1000, Update = () => { s_Second = (s_Second + 1) % 60; } });
      new Thread(starter).Start(new Looper { Length = 60 * 1000, Update = () => { s_Minute = (s_Minute + 1) % 60; } });
      new Thread(starter).Start(new Looper { Length = 60 * 60 * 1000, Update = () => { s_Hour++; } });

      Console.Out.WriteLine(@"Press e to exit, enter to write current time...");
      while (true) {
        string input = Console.In.ReadLine();
        if (input == "e") {
          Environment.Exit(0);
          return;
        }
        Console.Out.WriteLine("{0:00}:{1:00}:{2:00},{3}", s_Hour, s_Minute, s_Second, s_Millisecond);
      }
    }
  }
}

Thread.Sleep только гарантирует, что поток будет спать в течение минимума того, что указано в скобках. При желании он может спать дольше.
Брайан Бетчер

1

Linux, большинство оболочек, на оборудовании с RTC:

echo `cat /sys/class/rtc/rtc0/{date,time} | tr "\n" " "`

Разве это не вызывает API даты / времени?
Hosch250

Я не понимаю, что такое эхо-оболочка. Предположительно, вы хотите нормализовать расстояние между словами, но если это так, то почему tr? Может ты просто хочешь paste -d' ' /sys/class/rtc/rtc0/{date,time}?
Кодзиро

Что если я попробую это на малиновом PI, у которого нет RTC ?!
Джордж

@kojiro Да, и ваш путь чище.
trav

1

Ява

Мы все знаем, что Java Date / Time API непригоден и сломан. Итак, вот исправление, которое (по крайней мере, напрямую) не использует ни один из существующих API. Он даже поддерживает високосные секунды! :) Вывод в UTC.

import java.lang.reflect.Field;
import java.net.HttpCookie;
import java.util.*;

public class FixedTimeAPI4Java {

    private static final List<Integer> MONTHS_WITH_30_DAYS = Arrays.asList(4, 6, 9, 11);
    private static final List<Integer> YEARS_WITH_LEAP_SECOND_IN_DECEMBER = Arrays.asList(1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1987, 1989, 1990, 1995, 1998, 2005, 2008);
    private static final List<Integer> YEARS_WITH_LEAP_SECOND_IN_JUNE =  Arrays.asList(1972, 1981, 1982, 1983, 1985, 1992, 1993, 1994, 1997, 2012);

    /**
    * Returns the UTC time, at the time of method invocation, with millisecond
    * precision, in format <code>yyyy-MM-dd HH:mm:ss.SSS</code>.
    */
    public String getTime() throws Exception {

        // The cookie is only used for accessing current system time
        HttpCookie cookie = new HttpCookie("Offline", "Cookie");
        Field created = HttpCookie.class.getDeclaredField("whenCreated");
        created.setAccessible(true);

        long millisecondsSinceEpoch = created.getLong(cookie);        
        long fullSecondsSinceEpoch = millisecondsSinceEpoch / 1000L; 

        int year = 1970, month = 1, dayOfMonth = 1, hour = 0, minute = 0, second = 0,
            millisecond = (int)(millisecondsSinceEpoch - (fullSecondsSinceEpoch * 1000L));

        ticks: 
        for (;; year++) {
            for (month = 1; month <= 12; month++) {
                for (dayOfMonth = 1; dayOfMonth <= daysInMonth(month, year); dayOfMonth++) {
                    for (hour = 0; hour < 24; hour++) {
                        for (minute = 0; minute < 60; minute++) {
                            for (second = 0; second < secondsInMinute(minute, hour, dayOfMonth, month, year); second++, fullSecondsSinceEpoch--) {
                                if (fullSecondsSinceEpoch == 0) {
                                    break ticks;
                                }
                            }
                        }
                    }
                }
            }
        }
        return String.format("%04d-%02d-%02d %02d:%02d:%02d.%03d", year, month,
            dayOfMonth, hour, minute, second, millisecond);
    }

    /**
     * Returns the seconds in the given minute of the given hour/day/month/year,
     * taking into account leap seconds that can be added to the last minute of
     * June or December.
     */
    private static int secondsInMinute(int minute, int hour, int day, int month, int year) {
        return (minute == 59 && hour == 23 && ((day == 30 && month == 6) || (day == 31 && month == 12))) 
                ? 60 + leapSecondsInMonth( month, year) 
                : 60;
    }

    /**
     * Returns the number of days in the given month of the given year.
     */
    private static int daysInMonth(int month, int year) {
        return month == 2 ? isLeapYear(year) ? 29 : 28
                : MONTHS_WITH_30_DAYS.contains(month) ? 30
                    : 31;
    }

    /** 
     * Returns whether the given year is a leap year or not. 
     * A leap year is every 4th year, but not if the year is divisible by 100, unless if it's divisible by 400.
     */
    private static boolean isLeapYear(int year) {
        return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? true : false;
    }

    /** 
     * Returns the number of leap seconds that were added to UTC time at the end of the given month and year.
     * Leap seconds are added (by the decison of International Earth Rotation Service / Paris Observatory)
     * in order to keep UTC within 0.9 seconds of international atomic time (TAI).
     * <p>TODO: implement parser for updated list at http://www.ietf.org/timezones/data/leap-seconds.list :)
     */
    private static int leapSecondsInMonth(int month, int year) {        
        return (year < 1972 || year > 2012) ? 0
                : (month == 6 && YEARS_WITH_LEAP_SECOND_IN_JUNE.contains(year)) ? 1
                    : (month == 12 && YEARS_WITH_LEAP_SECOND_IN_DECEMBER.contains(year)) ? 1
                        : 0;
    }

    public final static void main(String[] args) throws Exception {
        System.out.println(new FixedTimeAPI4Java().getTime());        
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.