Czy możesz mi powiedzieć godzinę? [Zamknięte]

55

Wiesz, że interfejsy API zegara / czasu twojego języka są zepsute i wcale nie są wiarygodne.

Dlatego nie wolno używać żadnego wbudowanego interfejsu API do uzyskiwania dostępu do systemowej daty / godziny.

Ale wiesz również, że zdolność twojego języka do wykonywania obliczeń matematycznych i zachowywania wartości daty / godziny w zmiennej są prawidłowe.

Napisz program, który drukuje bieżącą datę / godzinę bez wywoływania interfejsów API daty / godziny / zegara. Na przykład DateTime.Now, GetDate()i podobne funkcje nie są dozwolone.

Odpowiedź z większością głosów wygranych.

W przypadku remisu wygrywa odpowiedź z większą precyzją (dokładność do sekund, potem milisekund, następnie mikrosekund i tak dalej).

drobnoustrój
źródło
2
Innymi słowy, porozmawiać z serwerem czasu?
Peter Taylor
3
Tak, możesz to zrobić. Jedno możliwe rozwiązanie.
drobnoustrój
3
Raczej niespecyficzne pytanie. Wydaje mi się, że najwięcej głosów uzyska odpowiedź podobna print(input("Please enter the current time")).
Howard,
7
Moje pieniądze są na „Załaduj REPL dla innego języka i zadzwoń do jego interfejsu API z czasem nieprzerwanym”.
Jonathan Van Matre
2
@ kanapka, która również nie jest dozwolona. Ponieważ twoja odpowiedź stanie się niewiarygodna.
mikrob

Odpowiedzi:

121

Jawa

Prawie wszystkie obecne rozwiązania zakładają, że lokalny / zdalny komputer nie kłamie na temat aktualnego czasu (czy uważasz, że T-600 również?).
Kluczowym punktem w obliczaniu czasu jest zaufanie do czystej natury .
Ta aplikacja na Androida prosi użytkownika o zrobienie zdjęcia nieba i przewidywanie bieżącego czasu z wyjątkową precyzją:

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;
    }
}

Wyniki:

wprowadź opis zdjęcia tutaj


wprowadź opis zdjęcia tutaj

Piotr
źródło
49
+1 za "There is no sky. Everyone's going to die": D
Klamka
6
„Wszyscy umrą - lub twój palec znajdzie się nad kamerą. Zasadniczo to samo”.
corsiKa
Proszę podać Java
user1886419
3
To zdecydowanie moja ulubiona, mam tylko nadzieję, że nie sprowadza się ona do remisu ...
Dryden Long
21
Co z Zaćmieniami? Prawdopodobnie powodują tutaj tyle samo problemów, co podczas programowania w Javie!
pa
64

Rubin

Bądźmy szczerzy: czas zmienia się tylko wtedy, gdy coś jest publikowane na stackoverflow.com ;)

Skrypt wyodrębnia czas etykiety „XYs ago” w najwyższym pytaniu.

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

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

Wynik:

2014-03-10 18:40:05Z
David Herrmann
źródło
2
Tylko z dokładnością do drugiego ... i drugiego, który SO śpiewa ntp.. wstydliwe uwielbienie
David Wilkins
3
<CENTER> NIE MOŻE PRZYTRZYMAĆ
Klamka
@ Doorknob Naprawdę muszę wydrukować ten post i powiesić go na ścianie.
wchargin
30

Grzmotnąć

Lubię to? (wymaga wgeti grep)

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

Dane wyjściowe otrzymałem kilka minut temu:

                    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": {} });

Albo to? (wymaga wgeti eog)

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

Dane wyjściowe otrzymuję teraz: (Zdjęcie xkcd )

mapa świata ze strefą czasową http://c.xkcd.com/redirect/comic/now

ace_HongKongIndependence
źródło
@tbodt Nie jestem pewien, czy zobaczysz ten komentarz. Twoja edycja jest nieprawidłowa, ponieważ http://c.xkcd.com/redirect/comic/nowdaje obraz, podczas gdy http://xkcd.com/nowdaje stronę internetową.
ace_HongKongIndependence
9
Właśnie zdałem sobie sprawę, że komiks wyświetlał zmiany w zależności od pory dnia. To cudownie.
RJFalconer,
2
Szkoda, że ​​kreskówka nie zawiera czasu letniego. (Na przykład, wschodnie stany USA są tylko cztery godziny za Wielką Brytanią, gdy piszę to, a nie normalne pięć, jakie pokazuje kreskówka.) Co ważniejsze, półkule północna i południowa mogą przesunąć się o dwie godziny poza synchronizacją.
David Richerby,
16
Mówię +1 do xkcd za nieprzestrzeganie czasu letniego i mam nadzieję, że reszta świata pójdzie w ich ślady.
hoosierEE
29

sh / coreutils

touch . && stat . -c %z

Wypisuje datę w nieco niestandardowym formacie:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
chociaż myślę, że może to zależeć od ustawień regionalnych.

mniip
źródło
1
Nie działa Mówi, że odmówiono zgody :)
devnull
5
@devnull twój system plików jest strasznie uszkodzony. Napraw to za pomocącd $(mktemp -d)
mniip
Meh, czas reżimu jest ustawiany za pomocą funkcji biblioteki.
Navin
@Navin To nie jest ustawione. I-węzeł katalogu właśnie został otwarty do zapisu, a jądro aktualizuje swój mtime. Nie ma wyraźnego set mtime to thissyscall dzieje wszędzie
mniip
@niip Welll, w porządku. Nadal uważam, że touchjest to funkcja / polecenie biblioteczne, ponieważ ma pożądany efekt uboczny.
Navin
25

PHP

Wykorzystaj fakt, że uniqid()zwraca identyfikator na podstawie czasu.

$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;

Podczas mojego testu, powrócił: Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49.
Nie wiem, czy mogę datepoprawnie sformatować, więc przekonwertowałem go ręcznie.

Michael M.
źródło
2
Jestem pewien, że to uniqid
naginanie
Dlaczego ? tak, uniqidużyj interfejsu API niskiego poziomu czasu, ale nawet jeśli poprosisz o czas z zewnętrznego serwera, gdzieś pojawi się interfejs API niskiego poziomu ...
Michael M.
1
Nie mówię tu o czasowych wywołaniach API. Mówię, że to wciąż część języka.
mniip
2
@niip tak, ale uniqid()został zepsuty, zanim jeszcze zadano to pytanie. tylko interfejsy API zegara / czasu są zepsute w tym pytaniu
Riking
23

DNS

Czy nie ufamy tylko własnej maszynie? Jeśli tak, czy to się liczy?

ssh $othermachine date

Jeśli to się nie liczy, wyodrębnienie czasu z aktualizacji DNS zdecydowanie:

dig stackexchange.com | grep WHEN
orion
źródło
23

Grzmotnąć

Aby być zawsze absolutnie precyzyjnym i poprawnym:

echo "Now"

lub motywowanie:

echo "Now, do something useful today"
Master117
źródło
10
muchomor, rzeczownik, liczba mnoga ropuchy. Pochlebny pochlebca; pochlebca. ( Źródło )
ace_HongKongIndependence
3
Nie absolutely precise, uruchomienie komendy zajmie trochę czasu.
user80551,
2
@ user80551 I to, że się myliłeś, teraz jest zawsze idealnie precyzyjne. Jeśli spojrzysz na swój czas oglądania, zmienia się zanim obraz dotrze do twojego oka. Ale teraz, teraz jest zawsze teraz.
Master117,
10
@ user80551 echo "Then"działa dla tego wymagania.
Taemyr
2
-Na co do diabła patrzę? Kiedy tak się dzieje w programie? -Teraz! Patrzysz na Teraz, proszę pana, cokolwiek się teraz dzieje w programie, co się teraz dzieje. -Co do tego dołączysz? -To minęło -Kiedy? -Tylko teraz
ilmale
20

curl - z dokładnością do dowolnej częstotliwości pingowania

curl -s time.nist.gov:13
David Wilkins
źródło
Fajnie, ale jest w UTC, czy nie powinno być w czasie lokalnym?
Orion
24
@orion Czy nie jesteśmy lokalni dla wszechświata?
Pureferret,
Jest to jeden z 2 domyślnych serwerów używanych przez system Windows do synchronizacji czasu.
Ismael Miguel
@ IsmaelMiguel jest także używany przez wiele niestandardowych systemów ..
David Wilkins
Po prostu mówię. Nie twierdzę, że jest to jedyne miejsce, w którym jest używane. Po prostu mówię fakt.
Ismael Miguel
14

Pyton

Na pewno nie wiesz, która jest godzina?!? Oto przypomnienie:

print "It's Adventure Time!"
Antonio Ragagnin
źródło
6
Czas na clobberin :)
orion
13

Python 2

Tak więc zegar jest poprawny, ale interfejs API czasu jest zamknięty, prawda? Dlaczego nie sprawdzić surowego znacznika czasu systemu plików. Zamiast tworzyć plik testowy, po prostu używamy własnego znacznika czasu dostępu, ponieważ skrypt musi zostać odczytany, aby uruchomić (nawet jeśli został skompilowany). Dokładnie do sekundy. *

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

Należy to zapisać i uruchomić jako t.py. Alternatywnie, pobierz nazwę skryptu w czasie wykonywania za pomocąinspect.getfile(inspect.currentframe())

Uwaga * Czasami dokładne do poprzedniej sekundy.

Alexis
źródło
Powinniśmy sprawdzić, t.pycczy t.pyozamiast tego?
Kyle Kelley
1
Dobre myślenie, ale nie będą istnieć, dopóki nie zaimportujesz tego pliku jako modułu (lub utworzysz go ręcznie). W każdym razie sprawdziłem i python (2.7.2 w OS X) dotknie .pypliku, nawet jeśli odpowiedni .pycjest obecny. To zawsze działa poprawnie.
Alexis
Zauważone i pochwalone. Ładnie wykonane.
Kyle Kelley
10

Rubin

HTTP, ale tylko przy użyciu metadanych odpowiedzi.

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
Nie ten Charles
źródło
9

ps

Nie możesz pspodać godziny? To może!

sleep 1&  ps -o lstart -p $!

Proces jest uruchamiany w tle i pswskazuje godzinę rozpoczęcia procesu. Ponieważ proces rozpoczął się w tle, czas rozpoczęcia procesu jest prawie taki sam jak teraz.

Ponadto zaletą jest to, że czas jest uzyskiwany w lokalnej strefie czasowej. Nie potrzebujesz też połączenia z Internetem!

diabelnie
źródło
7

vba

ponieważ nie powinienem.

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

użyj, ?DateTimeaby użyć lub jeśli umieścisz go w programie Excel, a następnie =DateTime()będzie działać jako formuła.
Data / czas są zwracane w GMT - pozostawiam to jako ćwiczenie na próżno, aby przekonwertować go z ciągu na czas lokalny

SeanC
źródło
6

Bash + last+ head+cut

Dokładnie do drugiego. lastużywa pliku dziennika/var/log/wtmp

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

EDYCJA: Dodano, headaby ograniczyć tylko do jednej linii.

EDYCJA: Działa na Linux Mint 13 Cinnamon 64-bit, ale wygląda na to, że zależy to od twojej dystrybucji. sysvinit-utils(która zapewnia last) wersja jest 2.88dsf-13.10ubuntu11.1 lastodczytywana z /var/log/wtmp(w moim przypadku), więc wyniki zależą od tego pliku dziennika. Zobacz komentarze poniżej.

EDYCJA: Najwyraźniej zależy to od czasu pracy systemu, więc możesz zobaczyć dowód tutaj http://imgur.com/pqGGPmE

użytkownik80551
źródło
Zwraca tutaj pustą linię. I nie jestem pewien, czy można stamtąd wydobyć coś istotnego, ponieważ człowiek lastmówi: „Ponowne uruchomienie pseudo użytkownika loguje się przy każdym ponownym uruchomieniu systemu.” (I nawet to nie wydaje się poprawne tutaj: pastebin.com/ArUaBcuY )
manatwork
@manatwork imgur.com/SeJX9RA W rzeczywistości -Fdrukuje pełne czasy logowania i wylogowania . Ponieważ bieżący użytkownik jest nadal zalogowany, czas wylogowania jest bieżącym czasem. To jest na Linux Mint 13 cynamon 64-bitowy. To może być zależne od regionu, ale wątpię.
user80551,
@manatwork To też tu
user80551
2
Uszkodzony na łuku (systemd). Zwraca „nadal działa”.
Orion
5
W rzeczywistości „nadal działa” to przynajmniej filozoficznie poprawny czas.
Orion
5

Pyton

Uzyskanie precyzji nanosekundowej byłoby trudne, chyba że zwracany czas był oparty na tym, kiedy program kończy działanie, a nie na początku. Mając to na uwadze, bardziej sensowne jest obliczanie czasu na podstawie zakończenia programu. Oznacza to, że powinniśmy kontrolować, kiedy program przestanie działać, aby uzyskać dodatkową precyzję.

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

Zauważ, że zakłada to, że podczas gdy zegar pytona jest przerywany, zegar uderzenia nie jest, lub że zegar uderzenia przynajmniej wie, jaki jest dzień. Jeśli nie, możemy zamiast tego użyć tego:

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

Może być jednak nieco wolniejszy. Nie testowałem tego.

Hovercouch
źródło
5

BrainFuck

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

Wynik:

5PM

Myślę, że wyświetla czas w Denver w momencie pisania. Wyjaśnienie algorytmu tutaj w tym filmie Alana Jacksona .

Sylwester
źródło
xkcd.com/221, ale widzę czas.
val
@val Oboje mają wspólną właściwość, którą stały się w czasie wykonywania, ale piosenka jest poprawna. Gdzieś jest godzina 17. XKCD dzieje się dużo, ponieważ nowi programiści uważają, że obliczanie czasu ekspansji makr pozwala zaoszczędzić czas.
Sylwester
Ale to naprawdę oszczędza czas! W rezultacie faktycznie wykonywalny.
val
5

Rubin

`date`

Nie używa interfejsu API zegara / czasu języka.

czarny
źródło
Co to dokładnie robi?
Hosch250
1
Wykonuje polecenie daty w powłoce i zwraca dane wyjściowe.
bblack
4

Podobał mi się pomysł „czytania z serwera czasu”. Poprawiłem jednak formatowanie i dodałem kilka miast dla zabawy.

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>";
Vereos
źródło
4

Grzmotnąć

echo "It's eight o'clock."

Dzięki dzięki The Goon Show . (Również ma rację dwa razy dziennie!)

David Richerby
źródło
7
Bardziej jak osiemdziesiąt razy dziennie :-D
piskliwy kostur
1
@squeamishossifrage Good point. Jeśli więc dojdzie do remisu, mam 18-minutową precyzję! ;-)
David Richerby
1
nie śmieszne
Mhmd
4

C / WinAPI

To powoduje założenie, że moje własne wywołania API do zapytania zegara są zepsute, ale sam system może poprawnie pracować z czasem.

// 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);

Pomysł polega na utworzeniu pliku tymczasowego i odczytaniu czasu utworzenia, który moim zdaniem w systemie plików NTFS jest dokładny do 10 ms. Zauważ, że formatowanie danych wyjściowych jest niepewne, ale dzieje się tak, ponieważ jestem leniwy.

Dane wyjściowe na moim komputerze właśnie teraz: Time is 10:39:45.790

icabod
źródło
1
// NO ERROR CHECKING - that's left as an exercise for the reader- Lepiej tego nie widzę w kodzie produkcyjnym
wchargin
4

Partia

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

Zapisuje pustą linię do pliku wsadowego (samego), a następnie sprawdza czas ostatniego zapisu pliku.

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

H:\uprof>GetTime.bat
09:29 AM
nieprzyzwoity
źródło
3

HTML, CSS i JavaScript / jQuery

Ok, więc wiem, że technicznie nie jest to program i prawdopodobnie nie spełnia kryteriów, ale za kilka godzin będzie to najdokładniejszy zegar na świecie!

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();

Na początku miałem zamiar zrobić while(true)pętlę, ale potem przypomniałem sobie, że nie chcę zawieszać żadnych przeglądarek ...

Oto skrzypce w akcji: http://jsfiddle.net/E7Egu/

wprowadź opis zdjęcia tutaj

Dryden Long
źródło
4
flare_points ++;
scunliffe
Uwielbiam to, że 2 lata później ktoś przychodzi i głosuje w dół ... lol
Dryden Long
3

Emacs Lisp

Sprawa google została wykonana, ale nie w 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 ">"))))))
Jordon Biondo
źródło
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));
}
Chris
źródło
1
brakowało tam kilku zależności. Co to za smak Linuksa?
Nie to, że Charles
1
Czego brakuje, katalogu / sys / class / rtc / rct0? Jestem na Arch Linux.
Chris
1
tak, tego nie ma na wszystkich systemach * nix, a tym bardziej na wszystkich systemach!
Nie to, że Karol
1

JavaScript

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

Ponieważ interfejs API zegara / czasu jest zepsuty, używam interfejsu API Performance, aby uzyskać czas. Następnie Datesłuży tylko do parsowania go do łańcucha.

Oriol
źródło
2
Nie jestem pewien, czy to pasuje do reguł :)
Oriol
Ten interfejs API ma straszne wsparcie.
Ismael Miguel
1

PHP:

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

Spowoduje to odczytanie czasu systemowego z dostępnego interfejsu wiersza poleceń.

Do tego celu służy operator wsteczny: uruchom polecenie.

Innym sposobem byłoby:

$_SERVER['REQUEST_TIME'];

Który zawiera aktualny czas, w którym skrypt został wywołany.

Ismael Miguel
źródło
Czy to nie zależy od twojego własnego systemu na czas?
Maurice
2
Pierwszy wiersz pytania : „Wiesz, że interfejsy API zegara / czasu twojego języka są zepsute i wcale nie są wiarygodne”. Myślę, że to wyjaśnia się samo.
Ismael Miguel
1

Grzmotnąć

export PS1="(\t) $PS1"

Trochę omija zasady, ale nigdy nie wywołuje funkcji czasu. Będzie jednak wyświetlać aktualny czas na wyjściu, a za każdym razem, gdy naciśniesz, wprowadź.

Komintern
źródło
1

DO#

Ta bardzo dokładna metoda będzie działać - pod warunkiem, że uruchomisz program o godzinie 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);
      }
    }
  }
}
Ondrej Svejdar
źródło
Thread.Sleep gwarantuje tylko, że wątek będzie spał przez minimum to, co jest określone w nawiasie. Opcjonalnie może spać znacznie dłużej.
Bryan Boettcher
1

Linux, większość powłok, na sprzęcie z RTC:

echo `cat /sys/class/rtc/rtc0/{date,time} | tr "\n" " "`
trav
źródło
Czy to nie wywołuje interfejsu API daty / godziny?
Hosch250
Nie dostaję echa podpowłoki. Prawdopodobnie chcesz znormalizować odstępy między wyrazami, ale jeśli tak, to dlaczego tr? Może po prostu chcesz paste -d' ' /sys/class/rtc/rtc0/{date,time}?
kojiro
Co jeśli spróbuję tego na malinowym PI, który nie ma RTC ?!
George
@kojiro Tak, a twoja droga jest czystsza.
podróż
1

Jawa

Wszyscy wiemy, że Java Date / Time API jest bezużyteczny i uszkodzony. Oto poprawka, która nie używa (przynajmniej bezpośrednio) żadnego z istniejących API. Obsługuje nawet sekundy przestępne! :) Dane wyjściowe są w 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());        
    }
}
Mick Mnemonic
źródło