Не могли б ви сказати мені час? [зачинено]


55

Ви знаєте, що API часу та часу вашої мови порушені, і вони зовсім не надійні.

Тож вам не дозволяється використовувати будь-який вбудований API для доступу до системного часу / дати.

Але ви також знаєте, що вміння вашої мови виконувати математику дати та зберігати значення змінної дати / часу у змінній є правильними.

Написати програму, яка друкує поточну дату / час без виклику API дати / часу / годинника. Наприклад DateTime.Now, GetDate()і подібні функції заборонені.

Відповідь з більшістю результатів виграє.

У випадку зрівноваження відповідь з більшою точністю виграє (тобто точні до секунд, потім мілісекунди, потім мікросекунди тощо).


2
Іншими словами, поговорити з сервером часу?
Пітер Тейлор

3
Так, ви можете це зробити. Одне можливе рішення.
мікробій

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

7
Мої гроші перебувають на "Завантажити REPL для іншої мови та зателефонуйте до її нерозбитого API часу"
Джонатан Ван Матре

2
@swich, що також заборонено. Тому що ваша відповідь стане ненадійною.
мікробій

Відповіді:


121

Java

Майже всі сучасні рішення припускають, що локальний / віддалений комп'ютер не бреше про поточний час (чи вважаєте ви 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
<СЦЕНТЕР> НЕ МОЖЕ ВКЛЮЧИТИ ВИНАГАЄ
Дверна ручка

@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

ш / ядро

touch . && stat . -c %z

Виводить дату у дещо нестандартному форматі:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
Хоча, мабуть, це може залежати від локальної мови.


1
Не працює. У ньому сказано, що в дозволі відмовлено :)
devnull

5
@devnull ваша файлова система страшенно зламана. Виправити цеcd $(mktemp -d)
mniip

Мех, час dir встановлюється за допомогою функції бібліотеки.
Навін

@Navin Не встановлено. Щойно відкритий для inode каталог відкривається, і ядро ​​оновлює mtime. set mtime to thisНіде явного систематичного дзвінка не відбувається ніде
квітня

@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 API низького рівня ...
Michael M.

1
Я не кажу тут про часові дзвінки API. Я кажу, що це все-таки частина мови.
mniip

2
@mniip так, але uniqid()його зламали, перш ніж це питання навіть задали. у цьому питанні
порушені

23

DNS

Ми лише не довіряємо власній машині? Якщо так, чи враховується це?

ssh $othermachine date

Якщо це не враховується, вилучення часу з оновлення DNS напевно:

dig stackexchange.com | grep WHEN

23

Баш

Просто завжди бути абсолютно точним і правильним:

echo "Now"

або мотивуючий:

echo "Now, do something useful today"

10
тоді, іменник, множина жаб. Покірний лестощі; сикофант. ( Джерело )
ace_HongKongIndependence

3
Ні absolutely precise, виконання команди все одно займе трохи підлітковий час.
user80551

2
@ user80551 І ось ти помилявся, це завжди абсолютно точно. Якщо ви подивитесь, як змінився час перегляду, перш ніж зображення потраплять на ваш погляд. Але тепер, тепер завжди зараз.
Майстер117

10
@ user80551 echo "Then"працює для цієї вимоги.
Taemyr

2
-Що на чорт я дивлюся? Коли це відбувається в програмі? -Зараз! Ви дивитесь зараз, сер, що б це не відбувалося зараз у програмі, що відбувається зараз. -Що додати тоді? -Прийшло -Коли? -Просто зараз
ilmale

20

curl - точний до будь-якого вашого курсу ping

curl -s time.nist.gov:13

Добре, але це в UTC, чи не має бути місцевого часу?
Оріон

24
@orion Хіба ми не місцеві для Всесвіту?
Pureferret

Це один із 2 серверів за замовчуванням, які Windows використовує для синхронізації часу.
Ісмаїл Мігель

@IsmaelMiguel він також використовується багатьма нестандартними системами ..
Девід Уілкінс

Я просто кажу. Я не кажу, що це єдине місце, де воно використовується. Я просто розповідаю факт.
Ісмаїл Мігель


13

Пітон 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присутній. Тож це завжди працює правильно.
alexis

Помічено та схвалено. Чудово зроблено.
Кайл Келлі

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

vba

тому що я не повинен.

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

Bash + last+ head+cut

Точно до другого. lastвикористовує файл журналу/var/log/wtmp

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

EDIT: додано, headщоб обмежитися лише одним рядком.

EDIT: Це працює на 64-бітному Linux Mint 13 Cinnamon, але здається, що це залежить від вашого дистрибутива. sysvinit-utils(яка надає last) версія 2.88dsf-13.10ubuntu11.1 lastзчитується з /var/log/wtmp(у моєму випадку), тому результати залежать від цього файлу журналу. Дивіться коментарі нижче.

EDIT: Мабуть, це залежить від часу роботи системи, щоб ви могли побачити доказ тут http://imgur.com/pqGGPmE


Це повертає порожній рядок тут. І я не впевнений , що - небудь відношення може бути вилучені звідти, як людина lastговорить (І навіть це не здається правильною тут: «Колода перезавантаження користувальницької псевда в кожен раз , коли система перезавантажується.» Pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA Насправді -Fдрукується повний час входу та виходу . Оскільки поточний користувач все ще входить, час виходу - це поточний час. Це на 64-бітному Linux Mint 13 кориці. Це може залежати від місцевості, але я сумніваюся.
користувач80551

@manatwork Він працює тут
user80551

2
Розбита на арку (systemd). Повертається "все ще працює".
Оріон

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."

Зверніть увагу, це передбачає або під час роботи пітонного годинника, і годинника bash немає або що годинник bash принаймні знає, який саме день. Якщо ні, ми можемо використовувати це:

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

Хоча це може бути трохи повільніше. Я цього не перевіряв.


5

BrainFuck

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

Вихід:

5PM

Я думаю, що він відображає час у Денвері на час написання. Пояснення алгоритму у цьому відео Алана Джексона .


xkcd.com/221 але час, я бачу.
val

@val Вони обидва діляться властивістю, що вони стали постійними під час виконання, але пісня є правильною. Це десь 5:00. Справа з XKCD трапляється багато, оскільки нові розробники думають, що обчислення часу розширення макросу економить час.
Сільвестер

Але це дійсно економить час! В результаті виконується фактично.
val

5

Рубін

`date`

Не використовує мову годинник / час API.


Що саме це робить?
Hosch250

1
Виконує команду дати в оболонці і повертає результат.
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

C / 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 ++;
сканліфф

Мені подобається, що через 2 роки хтось підходить і голосує за це ... хаха
Драйден Довгий

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 годин / часу порушено, я використовую API продуктивності, щоб отримати час. Потім Dateвикористовується лише для розбору його до рядка.


2
Не впевнений, чи відповідає він правилам :)
Оріол

Цей 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.Seep лише гарантує, що нитка буде спати мінімум того, що вказано в дужках. За бажанням він може спати набагато довше.
Брайан Боттчер

1

Linux, більшість оболонок, на апараті з RTC:

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

Це не викликає API дати / часу?
Hosch250

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

Що робити, якщо я спробував це на малиновому PI, у якого немає RTC ?!
Джордж

@kojiro Так, і ваш шлях чистіший.
травень

1

Java

Ми всі знаємо, що API дати / часу Java непридатний і зламаний. Тож ось виправлення, яке не використовує (принаймні безпосередньо) жодного з існуючих 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.