Könnten Sie mir bitte die Uhrzeit mitteilen? [geschlossen]


55

Sie wissen, dass die Uhr- / Zeit-APIs Ihrer Sprache fehlerhaft und überhaupt nicht zuverlässig sind.

Sie dürfen also keine integrierte API verwenden, um auf Systemzeit und -datum zuzugreifen.

Sie wissen aber auch, dass die Fähigkeit Ihrer Sprache, Datumsberechnungen durchzuführen und einen Datums- / Zeitwert in einer Variablen beizubehalten, korrekt ist.

Schreiben Sie ein Programm, das das aktuelle Datum / die aktuelle Uhrzeit druckt, ohne eine Datum / Uhrzeit / Uhrzeit-API aufzurufen. Zum Beispiel DateTime.Now, GetDate()und ähnliche Funktionen sind nicht erlaubt.

Die Antwort mit den meisten positiven Stimmen gewinnt.

Bei einem Gleichstand gewinnt die präzisere Antwort (dh sekundengenau, dann Millisekunden, dann Mikrosekunden usw.).


2
Mit anderen Worten, mit einem Zeitserver sprechen?
Peter Taylor

3
Ja, das kannst du. Eine mögliche Lösung.
Microbian

3
Eher unspezifische Frage. Ich denke, die meisten Stimmen werden durch eine Antwort wie gesammelt print(input("Please enter the current time")).
Howard

7
Mein Geld ist für "Laden Sie REPL für eine andere Sprache und rufen Sie die API für nicht unterbrochene Zeiten auf."
Jonathan Van Matre

2
@swich das ist auch nicht erlaubt. Weil Ihre Antwort unzuverlässig wird.
Microbian

Antworten:


121

Java

Bei fast allen aktuellen Lösungen wird davon ausgegangen, dass der lokale / entfernte Computer nicht über die aktuelle Uhrzeit lügt (glauben Sie auch, dass es sich um einen T-600 handelt?).
Entscheidend für die Berechnung eines Zeitpunkts ist das Vertrauen in eine reine Natur .
Diese Android-App fordert den Benutzer auf, ein Foto des Himmels aufzunehmen, und sagt die aktuelle Zeit mit herausragender Präzision voraus:

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

Ergebnisse:

Bildbeschreibung hier eingeben


Bildbeschreibung hier eingeben


49
+1 für "There is no sky. Everyone's going to die": D
Türklinke

6
"Jeder wird sterben - oder Ihr Finger ist über der Kamera. Im Grunde das Gleiche."
corsiKa

Bitte geben Sie Java
user1886419

3
Dies ist definitiv mein Favorit, ich hoffe nur, dass es nicht zu einem Tiebreaker kommt ...
Dryden Long

21
Was ist mit Finsternissen? Sie verursachen hier wahrscheinlich genauso viele Probleme wie während der Java-Entwicklung!
Tschüss,

64

Rubin

Mal ehrlich: Zeit ändert sich nur, wenn etwas auf stackoverflow.com gepostet wird ;)

Das Skript extrahiert die Zeit des Etiketts "XYs ago" in der obersten Frage.

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

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

Ausgabe:

2014-03-10 18:40:05Z

2
Nur auf die Sekunde genau ... und die Sekunde, in der SO seine ntp..shameful Anbetung pingt
David Wilkins

3
DAS <CENTER> KANN NICHT FESTHALTEN, DASS ER KOMMT
Türklinke

@Doorknob Ich muss diesen Beitrag wirklich ausdrucken und an meine Wand hängen.
wchargin

30

Bash

So was? (erfordert wgetund grep)

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

Die Ausgabe habe ich vor ein paar Minuten bekommen:

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

Oder dieses? (erfordert wgetund eog)

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

Ausgabe bekomme ich jetzt: (Bild von xkcd )

Weltkarte mit Zeitzone http://c.xkcd.com/redirect/comic/now


@ tbodt Nicht sicher, ob dieser Kommentar angezeigt wird. Ihre Bearbeitung ist ungültig, da http://c.xkcd.com/redirect/comic/nowein Bild http://xkcd.com/nowangezeigt wird, während eine Webseite angezeigt wird.
ace_HongKongIndependence

9
Ich habe gerade erst gemerkt, dass sich die Anzeige des Comics je nach Tageszeit ändert. Das ist großartig.
RJFalconer

2
Schade, dass der Cartoon keine Sommerzeit enthält. (Zum Beispiel sind die östlichen USA nur vier Stunden hinter Großbritannien, während ich dies schreibe, nicht die normalen fünf, die der Cartoon zeigt.) Noch wichtiger ist, dass sich die nördliche und südliche Hemisphäre zwei Stunden außerhalb der Synchronität befinden können.
David Richerby

16
Ich sage +1 zu xkcd, weil ich die Sommerzeit nicht beachtet habe, und hoffe, dass der Rest der Welt nachkommt.
hoosierEE

29

sh / coreutils

touch . && stat . -c %z

Gibt das Datum in einem etwas ungewöhnlichen Format aus:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
Obwohl ich denke, dass es vom Gebietsschema abhängt.


1
Funktioniert nicht Es heißt, Erlaubnis verweigert :)
devnull

5
@devnull dein Dateisystem ist schrecklich kaputt. Fix it withcd $(mktemp -d)
mniip

Meh, die dir-Zeit wird mit einer Bibliotheksfunktion eingestellt.
Navin

@ Navin Es ist nicht gesetzt. Der Verzeichnis-Inode wird nur zum Schreiben geöffnet, und der Kernel aktualisiert seine mtime. Es findet set mtime to thisnirgendwo ein expliziter
Systemaufruf statt

@ Mniip Welll, in Ordnung. Ich glaube immer noch, dass dies toucheine Bibliotheksfunktion / ein Bibliotheksbefehl ist, da er die gewünschte Nebenwirkung hat.
Navin

25

PHP

Nutzen Sie die Tatsache, dass uniqid()eine ID basierend auf der Zeit zurückgegeben wird.

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

Während meines Tests, es zurückgegeben: Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49.
Ich weiß nicht, ob ich eine datekorrekte Formatierung vornehmen kann, deshalb habe ich sie manuell konvertiert.


2
Ich bin mir sicher, dass dies uniqidein
Verstoß

Warum ? Ja, uniqidverwenden Sie die Low-Level-Zeit-API, aber selbst wenn Sie Zeit von einem externen Server anfordern, wird irgendwo eine Low-Level-Zeit-API aufgerufen ...
Michael M.

1
Ich spreche hier nicht von Zeit-API-Aufrufen. Ich sage, dass es immer noch ein Teil der Sprache ist.
Mittwoch,

2
@mniip ja, war aber uniqid()kaputt bevor diese frage überhaupt gestellt wurde. In dieser Frage sind nur die Clock / Time-APIs
fehlerhaft

23

DNS

Misstrauen wir nur unserer eigenen Maschine? Wenn ja, zählt das?

ssh $othermachine date

Wenn dies nicht zählt, bedeutet das Extrahieren der Zeit aus dem DNS-Update definitiv Folgendes:

dig stackexchange.com | grep WHEN

23

Bash

Um immer absolut präzise und korrekt zu sein:

echo "Now"

oder motivierend:

echo "Now, do something useful today"

10
toady, Substantiv, Plural toadies. Ein unterwürfiger Schmeichler; Schmeichler. ( Quelle )
ace_HongKongIndependence

3
Nicht absolutely precise, das Ausführen des Befehls wird noch ein bisschen Zeit in Anspruch nehmen.
user80551

2
@ user80551 Und wenn du dich geirrt hast, ist das jetzt immer genau. Wenn Sie auf Ihre Uhr schauen, ändert sich die Zeit, bevor das Bild Ihr Auge erreicht. Aber jetzt ist jetzt immer jetzt.
Master117

10
@ user80551 echo "Then"funktioniert für diese Anforderung.
Taemyr

2
- Was zum Teufel schaue ich an? Wann passiert das im Programm? -Jetzt! Sie sehen jetzt, Sir, was auch immer jetzt im Programm passiert, es passiert jetzt. -Was hängt dann an? -Wann ist es vorbei? -Nur jetzt
ilmale

20

Locken - genau auf Ihre Ping-Rate

curl -s time.nist.gov:13

Schön, aber es ist in UTC, sollte es nicht in der Ortszeit sein?
Orion

24
@orion Sind wir nicht lokal im Universum?
Pureferret

Dies ist einer der beiden Standardserver, mit denen Windows die Uhrzeit synchronisiert.
Ismael Miguel

@ IsmaelMiguel es wird auch von vielen nicht-Standard-Systemen verwendet ..
David Wilkins

Ich sag ja nur. Ich sage nicht, dass es der einzige Ort ist, an dem es verwendet wird. Ich sage nur eine Tatsache.
Ismael Miguel

14

Python

Bist du sicher, dass du nicht weißt, wie spät es ist?!? Hier ist eine Erinnerung:

print "It's Adventure Time!"

6
Es ist Clobberin 'Time :)
Orion

13

Python 2

Die Uhr ist also korrekt, aber die Zeit-API ist abgespritzt, oder? Überprüfen Sie den Zeitstempel eines unformatierten Dateisystems. Anstatt eine Testdatei erstellen, wir nur unseren eigenen Zugang Zeitstempel verwenden , da das Skript hat laufen zu lesen (auch wenn es kompiliert worden ist). Auf die Sekunde genau. *

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

Dies sollte gespeichert und ausgeführt werden als t.py . Alternativ können Sie den Skriptnamen zur Laufzeit mit abrufeninspect.getfile(inspect.currentframe())

Hinweis * Von Zeit zu Zeit auf die vorherige Sekunde genau .


Sollen wir überprüfen t.pycoder t.pyostattdessen?
Kyle Kelley

1
Gutes Denken, aber diese gibt es nur, wenn Sie diese Datei als Modul importieren (oder manuell erstellen). Trotzdem habe ich überprüft und Python (2.7.2 unter OS X) wird die .pyDatei berühren , auch wenn die entsprechende .pycvorhanden ist. Das funktioniert also immer richtig.
Alexis

Zur Kenntnis genommen und upvoted. Schön gemacht.
Kyle Kelley

10

Rubin

HTTP, aber nur unter Verwendung von Antwort-Metadaten.

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

Kannst psdu die Zeit nicht sagen? Es kann!

sleep 1&  ps -o lstart -p $!

Der Prozess wird im Hintergrund gestartet und gibt psdie Uhrzeit an, zu der der Prozess gestartet wurde. Da der Prozess im Hintergrund gestartet wurde, ist die Startzeit des Prozesses fast dieselbe wie jetzt.

Darüber hinaus besteht der Vorteil darin, dass die Zeit in der lokalen Zeitzone erhalten wird. Und Sie brauchen auch keine Internetverbindung!


7

vba

weil ich nicht sollte.

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

Verwenden Sie ?DateTime, oder wenn Sie es in Excel ablegen, =DateTime()wird es als Formel funktionieren.
Das Datum und die Uhrzeit werden in GMT zurückgegeben - ich überlasse es einer vergeblichen Übung, sie von einer Zeichenfolge in die Ortszeit umzuwandeln


6

Bash + last+ head+cut

Auf die Sekunde genau. lastVerwendet die Protokolldatei/var/log/wtmp

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

BEARBEITEN: Hinzugefügt head, um nur eine Zeile zu beschränken.

BEARBEITEN: Dies funktioniert unter Linux Mint 13 Cinnamon 64-Bit, aber es scheint, dass dies von Ihrer Distribution abhängt. sysvinit-utilsDie (bereitgestellte last) Version wird (in meinem Fall) 2.88dsf-13.10ubuntu11.1 lastgelesen, /var/log/wtmpsodass die Ergebnisse von dieser Protokolldatei abhängen. Siehe Kommentare unten.

BEARBEITEN: Anscheinend hängt dies von der Systemverfügbarkeit ab, sodass Sie den Beweis hier http://imgur.com/pqGGPmE sehen können


Das gibt hier eine leere Zeile zurück. Und ich bin nicht sicher , ob etwas relevant kann von dort extrahiert werden, wie man lastsagt (und nicht einmal das scheint hier richtig zu sein: „Die Pseudo-Benutzer Neustart anmeldet jedes Mal das System neu gestartet wird.“ Pastebin.com/ArUaBcuY )
Manatwork

@manatwork imgur.com/SeJX9RA Eigentlich -Fdruckt vollständige Login und Logout - Zeiten. Da der aktuelle Benutzer noch angemeldet ist, ist die Abmeldezeit die aktuelle Zeit. Dies ist auf Linux Mint 13 Cinnamon 64 Bit. Es mag vom Gebietsschema abhängen, aber ich bezweifle es.
user80551

@ Manatwork Es funktioniert auch hier
user80551

2
Am Bogen gebrochen (Systemd). Gibt "läuft noch" zurück.
Orion

5
Eigentlich ist "noch laufen" zumindest philosophisch eine richtige Zeit.
Orion

5

Python

Die Genauigkeit von Nanosekunden zu erhalten, wäre schwierig, es sei denn, die zurückgegebene Zeit basiert darauf, wann die Ausführung des Programms beendet ist, und nicht darauf, wann es startet. In diesem Sinne ist es sinnvoller, die Zeit basierend auf dem Ende eines Programms zu berechnen. Dies bedeutet, dass wir steuern sollten, wann ein Programm nicht mehr ausgeführt wird, um eine höhere Genauigkeit zu erzielen.

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

Beachten Sie, dass dies entweder vorausgesetzt wird, während die Python-Uhr gespalten ist, oder dass die Bash-Uhr zumindest weiß, welcher Tag es ist. Wenn nicht, können wir stattdessen Folgendes verwenden:

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

Könnte aber etwas langsamer sein. Ich habe es nicht getestet.


5

BrainFuck

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

Ausgabe:

5PM

Ich denke, es zeigt die Zeit in Denver zum Zeitpunkt des Schreibens. Die Erklärung für den Algorithmus hier von diesem Alan Jackson Video .


xkcd.com/221 aber für zeit sehe ich.
val

@val Beide teilen die Eigenschaft, dass sie zur Laufzeit konstant wurden, aber der Song ist korrekt. Irgendwo ist es 17 Uhr. Die XKCD-Sache passiert oft, da neue Entwickler denken, dass das Berechnen der Makro-Expansionszeit Zeit spart.
Sylwester

Aber es spart wirklich Zeit! In der daraus resultierenden ausführbaren Datei tatsächlich.
val

5

Rubin

`date`

Verwendet nicht die Clock / Time-API der Sprache.


Was genau macht das?
Hosch250

1
Führt den Date-Befehl in der Shell aus und gibt die Ausgabe zurück.
bblack

4

Ich mochte die Idee "Lesen von einem Zeitserver". Verbesserte die Formatierung und fügte einige Städte zum Spaß hinzu.

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

Dies setzt voraus, dass meine eigenen API-Aufrufe zum Abfragen der Uhr fehlerhaft sind, das System selbst jedoch mit der Uhrzeit korrekt arbeiten kann.

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

Die Idee ist, eine temporäre Datei zu erstellen und die Erstellungszeit zu lesen, die unter NTFS meiner Meinung nach auf 10 ms genau ist. Beachten Sie, dass die Formatierung der Ausgabe zweifelhaft ist, aber das ist nur so, wie ich faul bin.

Ausgabe gerade auf meinem Computer: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader- Ich sehe das besser nicht im Produktionscode
wchargin

4

Stapel

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

Schreibt eine leere Zeile in die Batch-Datei (selbst) und überprüft dann den letzten Schreibzeitpunkt der Datei.

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

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

3

HTML, CSS und Javascript / jQuery

Ok, ich weiß also, dass dies kein technisches Programm ist und wahrscheinlich außerhalb der Kriterien liegt, aber in nur wenigen Stunden wird dies die genaueste Uhr der Welt sein!

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

Zuerst wollte ich eine while(true)Schleife machen, aber dann fiel mir ein , dass ich keine Browser zum Absturz bringen wollte ...

Hier ist eine Geige davon in Aktion: http://jsfiddle.net/E7Egu/

Bildbeschreibung hier eingeben


4
flare_points ++;
Scunliffe

Ich finde es toll, dass 2 Jahre später jemand vorbeikommt und das runter stimmt ... lol
Dryden Long

3

Emacs Lisp

Die Google-Sache wurde gemacht, aber nicht in 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
Habe dort ein paar Dependances verpasst. Welche Linux-Variante ist das?
Nicht dass Charles

1
Was fehlt, das Verzeichnis / sys / class / rtc / rct0? Ich bin auf Arch Linux.
Chris

1
ja, das gibt es nicht auf allen * nix-systemen, geschweige denn auf allen systemen!
Nicht dass Charles

1

JavaScript

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

Da die Clock / Time-API defekt ist, verwende ich die Performance-API , um die Uhrzeit zu ermitteln. Dann Datewird es nur zum Parsen von Strings verwendet.


2
Nicht sicher, ob es den Regeln entspricht :)
Oriol

Diese API hat eine schreckliche Unterstützung.
Ismael Miguel

1

PHP:

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

Dadurch wird die Systemzeit von der verfügbaren Befehlszeilenschnittstelle gelesen.

Der Backtick-Operator wird dazu verwendet: Führen Sie einen Befehl aus.

Ein anderer Weg wäre:

$_SERVER['REQUEST_TIME'];

Welches enthält die aktuelle Uhrzeit, zu der das Skript aufgerufen wurde.


Hängt das nicht immer noch von Ihrem eigenen System ab?
Maurice

2
1. Zeile der Frage : "Sie wissen, dass die Uhr- / Zeit-APIs Ihrer Sprache fehlerhaft und überhaupt nicht zuverlässig sind." Ich denke, das erklärt sich von selbst.
Ismael Miguel

1

Bash

export PS1="(\t) $PS1"

Lässt die Regeln ein wenig außer Kraft, ruft aber niemals eine Zeitfunktion auf. Es wird jedoch die aktuelle Zeit beim Beenden und jedes Mal, wenn Sie danach die Eingabetaste drücken, angezeigt.


1

C #

Diese super-exakte Methode funktioniert - vorausgesetzt, Sie führen das Programm um 0: 00: 00,0000 aus

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 garantiert nur, dass ein Thread für ein Minimum dessen, was in der Klammer angegeben ist, inaktiv ist. Es kann optional viel länger schlafen bleiben.
Bryan Boettcher

1

Linux, die meisten Shells, auf Hardware mit einer RTC:

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

Ruft dies nicht eine Datums- / Uhrzeit-API auf?
Hosch250

Ich verstehe das Echo-Subshell-Bit nicht. Vermutlich möchten Sie den Wordsplit-Abstand normalisieren, aber wenn ja, warum tr? Vielleicht willst du nur paste -d' ' /sys/class/rtc/rtc0/{date,time}?
Kojiro

Was wäre, wenn ich das auf dem Himbeer-PI probieren würde, der keine RTC hat ?!
George

@kojiro Ja, und dein Weg ist sauberer.
Trav

1

Java

Wir alle wissen, dass die Java Date / Time API unbrauchbar und fehlerhaft ist. Hier ist ein Fix, der (zumindest direkt) keine der vorhandenen APIs verwendet. Es unterstützt sogar Schaltsekunden! :) Die Ausgabe erfolgt in 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());        
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.