Bisakah Anda memberi tahu saya waktu? [Tutup]


55

Anda tahu bahwa jam / waktu API bahasa Anda rusak dan tidak dapat diandalkan sama sekali.

Jadi, Anda tidak diizinkan menggunakan API bawaan apa pun untuk mengakses waktu / tanggal sistem.

Tetapi Anda juga tahu bahwa kemampuan bahasa Anda untuk melakukan matematika tanggal, dan mempertahankan nilai tanggal / waktu dalam suatu variabel sudah benar.

Tulis program yang mencetak tanggal / waktu saat ini tanpa memanggil tanggal / waktu / jam API apa pun. Misalnya DateTime.Now, GetDate()dan fungsi serupa tidak diperbolehkan.

Jawaban dengan sebagian besar kemenangan menang.

Dalam kasus seri, jawaban dengan kemenangan yang lebih presisi (yaitu, akurat hingga detik, kemudian milidetik, kemudian mikrodetik, dan sebagainya).


2
Dengan kata lain, bicara dengan server waktu?
Peter Taylor

3
Ya, Anda bisa melakukannya. Salah satu solusi yang mungkin.
microbian

3
Pertanyaan yang agak tidak spesifik. Saya kira suara terbanyak akan dikumpulkan oleh jawaban seperti print(input("Please enter the current time")).
Howard

7
Uang saya ada di "Muat REPL untuk bahasa yang berbeda dan panggil API waktu yang tidak rusak."
Jonathan Van Matre

2
@ yang juga tidak diizinkan. Karena jawaban Anda akan menjadi tidak dapat diandalkan.
microbian

Jawaban:


121

Jawa

Hampir semua solusi saat ini mengasumsikan bahwa komputer lokal / jarak jauh tidak berbohong tentang waktu saat ini (apakah Anda percaya T-600 juga?).
Poin kunci dalam perhitungan waktu adalah mempercayai sifat murni .
Aplikasi Android ini meminta pengguna untuk mengambil foto langit dan memperkirakan waktu saat ini dengan ketepatan luar biasa:

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

Hasil:

masukkan deskripsi gambar di sini


masukkan deskripsi gambar di sini


49
+1 untuk "There is no sky. Everyone's going to die": D
Gagang Pintu

6
"Semua orang akan mati - atau jarimu ada di atas kamera. Pada dasarnya hal yang sama."
corsiKa

Silakan tentukan Java
user1886419

3
Ini pasti favorit saya, saya hanya berharap itu tidak turun ke tiebreaker ...
Dryden Long

21
Bagaimana dengan Eclipses? Mereka cenderung menyebabkan banyak masalah di sini seperti yang mereka lakukan selama pengembangan Java!
sampai

64

Rubi

Jujur saja: waktu hanya berubah ketika ada sesuatu yang diposting di stackoverflow.com ;)

Script ini mengekstrak waktu label "XYs ago" dalam pertanyaan paling atas.

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

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

Keluaran:

2014-03-10 18:40:05Z

2
Hanya akurat untuk yang kedua ... dan yang kedua yang SO ping ntp nya ... ibadah yang memalukan
David Wilkins

3
THE <CENTER> TIDAK BISA TAHAN DIA
Doorknob

@ Doorknob saya benar-benar perlu mencetak posting itu dan menggantungnya di dinding saya.
wchargin

30

Pesta

Seperti ini? (membutuhkan wgetdan grep)

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

Output yang saya dapatkan beberapa menit yang lalu:

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

Atau ini? (membutuhkan wgetdan eog)

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

Output yang saya dapatkan sekarang: (Gambar oleh xkcd )

peta dunia dengan timezone http://c.xkcd.com/redirect/comic/now


@tbodt Tidak yakin apakah Anda akan melihat komentar ini. Hasil edit Anda tidak valid karena http://c.xkcd.com/redirect/comic/nowmemberikan gambar saat http://xkcd.com/nowmemberikan halaman web.
ace_HongKongIndependence

9
Saya baru saja menyadari bahwa komik yang ditampilkan berubah tergantung pada waktu hari. Itu luar biasa.
RJFalconer

2
Sayang kartun itu tidak memasukkan daylight saving. (Misalnya, AS bagian timur hanya empat jam di belakang Inggris ketika saya menulis ini, bukan lima yang normal yang ditunjukkan kartun itu.) Lebih penting lagi, belahan bumi utara dan selatan dapat bergerak dua jam dari selaras.
David Richerby

16
Saya katakan +1 ke xkcd karena tidak mengamati waktu musim panas, dan berharap seluruh dunia mengikutinya.
hoosierEE

29

sh / coreutils

touch . && stat . -c %z

Keluaran tanggal dalam format yang agak tidak standar:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
Meskipun saya kira itu mungkin tergantung pada lokal.


1
Tidak bekerja Dikatakan izin ditolak :)
devnull

5
@devnull filesystem Anda sangat rusak. Perbaiki dengancd $(mktemp -d)
mniip

Ya, waktu dir diatur menggunakan fungsi perpustakaan.
Navin

@Navin Tidak diatur. Inode direktori baru saja dibuka untuk penulisan, dan kernel memperbarui waktunya. Tidak ada set mtime to thissyscall eksplisit terjadi di mana saja
mniip

@niip Welll, baiklah. Saya masih merasa itu touchadalah fungsi / perintah perpustakaan karena memiliki efek samping yang diinginkan.
Navin

25

PHP

Mengeksploitasi fakta yang uniqid()mengembalikan ID berdasarkan waktu.

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

Selama pengujian saya, itu kembali: Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49.
Saya tidak tahu apakah saya dapat menggunakan dateformat dengan benar, jadi saya mengonversinya secara manual.


2
Saya yakin ini adalah pembengkokan dari peraturan ... uniqidmasih menjadi bagian dari bahasa Anda ... Tapi Anda masih mendapatkan +1
mniip

Mengapa ya, uniqidgunakan API waktu tingkat rendah tetapi bahkan ketika Anda meminta waktu dari server eksternal akan ada panggilan tingkat rendah ke waktu di suatu tempat ...
Michael M.

1
Saya tidak berbicara tentang waktu panggilan API di sini. Saya mengatakan bahwa itu masih merupakan bagian dari bahasa.
mniip

2
@mniip ya, tapi uniqid()sudah rusak sebelum pertanyaan ini bahkan diajukan. hanya API jam / waktu yang dilanggar dalam pertanyaan ini
Riking

23

DNS

Apakah kita hanya mempercayai mesin kita sendiri? Jika demikian, apakah ini diperhitungkan?

ssh $othermachine date

Jika itu tidak masuk akal, mengekstraksi waktu dari pembaruan DNS tentu saja:

dig stackexchange.com | grep WHEN

23

Pesta

Hanya untuk selalu sangat tepat dan benar:

echo "Now"

atau memotivasi:

echo "Now, do something useful today"

10
toady, kata benda, toadies jamak. Seorang penyanjung yang patuh; penjilat. ( Sumber )
ace_HongKongIndependence

3
Tidak absolutely precise, menjalankan perintah masih membutuhkan sedikit waktu.
user80551

2
@ user80551 Dan itu kalau Anda salah, sekarang selalu sangat tepat. Jika Anda melihat waktu jam Anda berubah sebelum gambar mencapai mata Anda. Tapi sekarang, sekarang selalu sekarang.
Master117

10
@ user80551 echo "Then"berfungsi untuk persyaratan itu.
Taemyr

2
-Apa yang aku lihat? Kapan ini terjadi dalam program? -Sekarang! Anda sedang melihat Sekarang, tuan, apa pun yang terjadi sekarang dalam program itu terjadi sekarang. -Apa yang ditambahkan kemudian? -Ini berlalu -Ketika? -Hanya sekarang
ilmale

20

curl - akurat untuk apa pun kecepatan ping Anda

curl -s time.nist.gov:13

Bagus, tapi di UTC, bukankah harusnya waktu lokal?
orion

24
@ Atau, bukankah kita lokal terhadap alam semesta?
Pureferret

Ini adalah salah satu dari 2 server default yang digunakan windows untuk menyinkronkan waktu.
Ismael Miguel

@IsmaelMiguel juga digunakan oleh banyak sistem non-standar ..
David Wilkins

Saya hanya mengatakan. Saya tidak mengatakan itu adalah satu-satunya tempat di mana itu digunakan. Saya hanya mengatakan fakta.
Ismael Miguel

14

Python

Anda yakin tidak tahu jam berapa sekarang?!? Ini pengingat:

print "It's Adventure Time!"

6
Sudah waktunya :) :)
orion

13

Python 2

Jadi, jamnya benar tetapi waktu API disembunyikan, bukan? Mengapa tidak memeriksa stempel waktu sistem file mentah. Alih-alih membuat file tes, kami hanya menggunakan timestamp akses kita sendiri karena script memiliki untuk dibaca untuk menjalankan (bahkan jika itu disusun). Akurat ke yang kedua. *

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

Ini harus disimpan dan dijalankan sebagai t.py . Bergantian, dapatkan nama skrip saat runtime denganinspect.getfile(inspect.currentframe())

Catatan * Terkadang akurat untuk detik sebelumnya .


Haruskah kita periksa t.pycatau t.pyosebaliknya?
Kyle Kelley

1
Pemikiran yang bagus tetapi ini tidak akan ada kecuali Anda mengimpor file ini sebagai modul (atau membuatnya secara manual). Pokoknya saya memeriksa dan python (2.7.2 pada OS X) akan menyentuh .pyfile bahkan jika yang sesuai .pycada. Jadi ini selalu berfungsi dengan benar.
alexis

Tercatat dan terangkat. Bagus sekali.
Kyle Kelley

10

Rubi

HTTP, tetapi hanya menggunakan respons meta-data.

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

Tidak pstahu waktu? Bisa!

sleep 1&  ps -o lstart -p $!

Proses dimulai di latar belakang dan psmemberi tahu waktu proses dimulai. Sejak proses dimulai di latar belakang, waktu mulai proses hampir sama dengan saat ini.

Selain itu, keuntungannya adalah waktu diperoleh di zona waktu lokal. Dan Anda tidak perlu koneksi internet juga!


7

vba

karena saya tidak boleh.

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

gunakan ?DateTimeuntuk digunakan, atau jika Anda memasukkannya ke Excel, maka =DateTime()akan berfungsi sebagai rumus.
Tanggal / waktu dikembalikan dalam GMT - Saya meninggalkannya sebagai latihan sia-sia untuk mengubahnya dari string ke waktu lokal


6

Bash + last+ head+cut

Tepat untuk yang kedua. lastmenggunakan file log/var/log/wtmp

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

EDIT: Ditambahkan headuntuk membatasi hanya satu baris.

EDIT: Ini berfungsi pada Linux Mint 13 Cinnamon 64-bit tetapi tampaknya ini tergantung pada distro Anda. sysvinit-utils(yang menyediakan last) versi 2.88dsf-13.10ubuntu11.1 lastdibaca dari /var/log/wtmp(dalam kasus saya) sehingga hasilnya tergantung pada file log itu. Lihat komentar di bawah.

EDIT: Rupanya ini tergantung pada sistem uptime sehingga Anda dapat melihat buktinya di sini http://imgur.com/pqGGPmE


Itu mengembalikan garis kosong di sini. Dan saya tidak yakin apa pun yang relevan dapat diekstraksi dari sana, seperti yang lastdikatakan oleh manusia , “Pengguna reboot log semu setiap kali sistem dinyalakan kembali.” (Dan bahkan itu pun tampaknya tidak benar di sini: pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA Sebenarnya, -Fmencetak waktu masuk dan keluar penuh . Karena pengguna saat ini masih masuk, waktu keluar adalah waktu saat ini. Ini ada di Linux Mint 13 cinnamon 64 bit. Mungkin tergantung lokal tapi saya ragu.
user80551

@manatwork Ini juga berfungsi di sini
user80551

2
Rusak pada lengkungan (systemd). Mengembalikan "masih berjalan".
orion

5
Sebenarnya, "masih berjalan" setidaknya secara filosofis adalah waktu yang tepat.
orion

5

Python

Mendapatkan ketepatan nanosecond akan sulit kecuali jika waktu yang dikembalikan didasarkan pada ketika program selesai berjalan, bukan ketika itu dimulai. Dengan mengingat hal itu, lebih masuk akal untuk menghitung waktu berdasarkan ketika sebuah program selesai. Ini berarti bahwa kita harus mengontrol ketika suatu program berhenti berjalan untuk mendapatkan ketepatan ekstra.

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

Catatan ini mengasumsikan baik ketika jam python borked, jam bash tidak atau bahwa jam bash setidaknya tahu hari apa itu. Jika tidak, kita bisa menggunakan ini:

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

Mungkin sedikit lebih lambat. Saya belum mengujinya.


5

BrainFuck

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

Keluaran:

5PM

Saya pikir ini menampilkan waktu di Denver pada saat penulisan. Penjelasan untuk algoritma di sini oleh video Alan Jackson ini .


xkcd.com/221 tetapi untuk waktu, saya mengerti.
val

@val Keduanya berbagi properti yang menjadi konstan saat runtime, tetapi lagunya benar. Ini adalah 5:00 di suatu tempat. Hal XKCD banyak terjadi karena pengembang baru berpikir menghitung dalam ekspansi makro menghemat waktu.
Sylwester

Tapi itu benar-benar menghemat waktu! Dalam menghasilkan dieksekusi sebenarnya.
val

5

Rubi

`date`

Tidak menggunakan API jam / waktu bahasa.


Apa sebenarnya yang dilakukan ini?
Hosch250

1
Menjalankan perintah tanggal di shell dan mengembalikan output.
bblack

4

Saya menyukai ide "membaca dari server waktu". Memperbaiki pemformatannya, dan menambahkan beberapa kota untuk bersenang-senang.

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

Ini membuat asumsi bahwa panggilan API saya sendiri untuk meminta jam rusak, tetapi sistem itu sendiri dapat bekerja dengan waktu dengan benar.

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

Idenya adalah untuk membuat file sementara, dan membaca waktu pembuatan, yang pada NTFS saya pikir akurat hingga 10 ms. Perhatikan bahwa format output rapuh, tapi itu murni karena saya malas.

Output pada mesin saya sekarang: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader- Saya lebih baik tidak melihat ini dalam kode produksi
wchargin

4

Batch

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

Menulis baris kosong ke file batch (sendiri), lalu memeriksa waktu tulis terakhir file.

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

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

3

HTML, CSS & Javascript / jQuery

Ok, jadi saya tahu ini bukan program teknis, dan mungkin berada di luar kriteria, tetapi hanya dalam waktu beberapa jam, ini akan menjadi jam paling akurat di dunia!

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

Pada awalnya saya akan melakukan while(true)loop, tetapi kemudian ingat bahwa saya tidak ingin crash browser apa pun ...

Berikut ini biola dalam aksinya: http://jsfiddle.net/E7Egu/

masukkan deskripsi gambar di sini


4
flare_points ++;
scunliffe

Saya suka bahwa 2 tahun kemudian seseorang datang dan memberi suara untuk ini ... lol
Dryden Long

3

Emacs Lisp

Hal google telah dilakukan tetapi tidak di 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
melewatkan beberapa ketergantungan di sana. Apa rasa Linux itu?
Bukan karena Charles

1
Apa yang hilang, direktori / sys / class / rtc / rct0? Saya di Arch Linux.
Chris

1
ya, itu yang tidak ada di semua sistem * nix, apalagi semua sistem!
Bukan karena Charles

1

JavaScript

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

Karena jam / waktu API rusak, saya menggunakan API Kinerja untuk mendapatkan waktu. Kemudian Datehanya digunakan untuk menguraikannya ke string.


2
Tidak yakin apakah itu sesuai dengan aturan :)
Oriol

API itu memiliki dukungan yang mengerikan.
Ismael Miguel

1

PHP:

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

Ini akan membaca waktu sistem dari antarmuka baris perintah yang tersedia.

Operator backtick digunakan untuk melakukan hal itu: jalankan perintah.

Cara lain adalah:

$_SERVER['REQUEST_TIME'];

Yang berisi waktu saat ini di mana skrip dipanggil.


Bukankah itu masih tergantung pada sistem Anda sendiri untuk waktu?
Maurice

2
Baris pertama dari pertanyaan : "Anda tahu bahwa jam / waktu API bahasa Anda rusak dan tidak dapat diandalkan sama sekali." Saya pikir ini menjelaskannya sendiri.
Ismael Miguel

1

Pesta

export PS1="(\t) $PS1"

Rok sedikit aturan, tetapi tidak pernah memanggil fungsi waktu. Ini akan menampilkan waktu saat ini saat keluar, dan setiap kali Anda menekan enter setelah itu.


1

C #

Metode super-tepat ini akan berfungsi - asalkan Anda akan menjalankan program pada 0: 00: 000000

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.Tidur hanya menjamin utas akan tidur untuk minimum dari apa yang ditentukan dalam tanda kurung. Secara opsional dapat tetap tidur lebih lama.
Bryan Boettcher

1

Linux, kebanyakan shell, pada perangkat keras dengan RTC:

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

Tidakkah ini memanggil API tanggal / waktu?
Hosch250

Saya tidak mendapatkan bit subshell gema. Mungkin Anda ingin menormalkan spasi kata-kata, tetapi jika demikian, mengapa harus trsedikit? Mungkin Anda hanya menginginkannya paste -d' ' /sys/class/rtc/rtc0/{date,time}?
kojiro

Bagaimana jika saya mencoba ini pada raspberry PI, yang tidak memiliki RTC ?!
George

@ Kojiro Ya, dan cara Anda lebih bersih.
trav

1

Jawa

Kita semua tahu Java Date / Time API tidak dapat digunakan dan rusak. Jadi, inilah perbaikan yang tidak (setidaknya secara langsung) menggunakan salah satu API yang ada. Bahkan mendukung detik kabisat! :) Outputnya dalam 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());        
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.