Bana saati söyleyebilir misiniz? [kapalı]


55

Dilinizin saat / saat API'sinin kırıldığını ve güvenilir olmadıklarını biliyorsunuz.

Bu nedenle, sistemin saatine / tarihine erişmek için herhangi bir yerleşik API kullanmanıza izin verilmez.

Ancak, dilinizin tarih matematiğini gerçekleştirme ve bir tarih / saat değerini bir değişkende tutmanın doğru olduğunu da biliyorsunuz.

Herhangi bir tarih / saat / saat API'sini çağırmadan geçerli tarih / saati yazdıran bir program yazın. Örneğin DateTime.Now, GetDate()ve benzeri fonksiyonlar izin verilmez.

En çok oy alan cevap, kazanır.

Beraberlik durumunda, daha hassas olan cevap kazanır (yani, saniye, sonra milisaniye, sonra mikrosaniye, vb. Kadar doğrudur).


2
Başka bir deyişle, bir zaman sunucusuyla görüşüyor musunuz?
Peter Taylor

3
Evet, bunu yapabilirsin. Bir olası çözüm.
microbian

3
Oldukça belirsiz bir soru. Sanırım en çok oy gibi bir cevapla toplanacak print(input("Please enter the current time")).
Howard,

7
Param, "Farklı bir dil için REPL'i yükle ve kırılmayan API'sini çağır."
Jonathan Van Matre

2
@swich de izin verilmez. Çünkü cevabın güvenilmez olacak.
microbian

Yanıtlar:


121

Java

Mevcut çözümlerin hemen hemen tümü, yerel / uzak bilgisayarın şu an hakkında yalan söylemediğini varsaymaktadır (siz de T-600'e inanır mısınız?).
Zaman hesaplamasındaki kilit nokta saf bir doğaya güvenmektir .
Bu Android uygulaması, kullanıcının gökyüzünün fotoğrafını çekmesini ister ve şimdiki zamanı olağanüstü bir hassasiyetle tahmin eder:

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

Sonuçlar:

görüntü tanımını buraya girin


görüntü tanımını buraya girin


49
+1 "There is no sky. Everyone's going to die"
şunun

6
“Herkes ölecek - ya da parmağın kamera üzerinde. Temelde aynı şey.”
corsiKa

Lütfen Java'yı belirtin
user1886419

3
Bu kesinlikle benim favorim, umarım bir başkasına düşmez ...
Dryden Long

21
Peki ya tutulmalar? Java geliştirme sürecinde burada olduğu gibi bir problemin ortaya çıkması muhtemeldir!
Güle güle

64

Yakut

Dürüst olalım: zaman yalnızca stackoverflow.com'da bir şey yayınlandığında değişir ;)

Komut, "XYs önce" etiketinin zamanını en üst soruya ayıklar.

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

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

Çıktı:

2014-03-10 18:40:05Z

2
Sadece ikinciye doğru olan ... ve ikincisi SO'nun ntp'larına ping attığı ... utanç verici ibadet
David Wilkins

3
<MERKEZİ> TUT CAN NOT HE GELİYOR
Doorknob

@Doorknob Gerçekten bu yazıyı yazdırmak ve duvara asmak zorundayım.
wchargin

30

darbe

Bunun gibi, böyle? (gerektirir wgetve grep)

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

Birkaç dakika önce aldığım çıktı:

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

Veya bu? (gerektirir wgetve eog)

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

Çıktı şimdi alıyorum: (Görüntü xkcd ile )

saat dilimi ile dünya haritası http://c.xkcd.com/redirect/comic/now


@tbodt Bu yorumu görüp göremeyeceğinizden emin değilsiniz. Düzenlemeniz geçersiz, çünkü web sayfası http://c.xkcd.com/redirect/comic/nowverirken resim http://xkcd.com/nowveriyor.
ace_HongKongIndependence 10:14

9
Sadece çizgi romanın günün saatine bağlı olarak değiştiğini fark ettim. Bu harika.
RJFalconer

2
Karikatürün, gün ışığından yararlanma tasarrufu içermemesi üzücü. (Örneğin, Doğu ABD, bunu yazarken İngiltere’nin sadece dört saat gerisinde, çizgi filmin gösterdiği normal beşi değil.) Daha önemlisi, kuzey ve güney yarım küreler eşzamanlı iki saat hareket edebilir.
David Richerby

16
Ben XKCD +1 demek değildir Yaz saatine gözlemleyerek ve dünyanın geri kalanı da takip etsin.
HoosierEE

29

sh / coreutils

touch . && stat . -c %z

Tarihi biraz standart olmayan bir biçimde verir:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
Her ne kadar yerel ayarlara bağlı olabilir sanırım.


1
Çalışmıyor İzin reddedildi diyor :)
devnull

5
@devnull dosya sisteminiz çok bozuk. Düzeltmekcd $(mktemp -d)
mniip 11:14

Meh, dir süresi bir kütüphane işlevi kullanılarak ayarlanır.
Navin

@Navin Ayarlanmadı. Dizin inode henüz yazmak üzere açıldı ve çekirdek, çalışma süresini güncelledi. set mtime to thisHerhangi bir yerde olan açık bir sistem yok
14:42

@mniip Welll, tamam. touchİstenilen yan etkiye sahip olduğundan, bunun bir kütüphane işlevi / komutu olduğunu hala hissediyorum .
Navin

25

PHP

Saate uniqid()bağlı olarak bir kimlik döndüren gerçeği kullanın .

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

Benim Yapılan testte döndürdü: Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49. Doğru biçimlendirmek
için kullanabilir miyim bilmiyorum date, bu yüzden el ile dönüştürdüm.


2
Eminim bu kurallara uniqid
uyuyor

Neden ? evet, uniqiddüşük seviyeli zaman API'sini kullanın , ancak harici bir sunucudan zaman talep etseniz bile, bir yerde düşük zaman çağrısı API'sı olacak ...
Michael M.

1
Burada API çağrılarının zamanından bahsetmiyorum. Bunun hala dilin bir parçası olduğunu söylüyorum.
saat

2
@mniip evet, ancak uniqid()bu soru sorulmadan önce kırıldı. sadece saat / saat API'leri bu soruda bozuldu
Riking

23

DNS

Sadece kendi makinemize güvenmiyor muyuz? Eğer öyleyse, bu sayılır mı?

ssh $othermachine date

Bu sayılmazsa, DNS güncellemesinden zaman çıkarmak kesinlikle şöyledir:

dig stackexchange.com | grep WHEN

23

darbe

Sadece her zaman kesinlikle kesin ve doğru olmak:

echo "Now"

veya motive edici:

echo "Now, do something useful today"

10
toady, isim, çoğul sözler. Bir titiz iltifatçı; dalkavuk. ( Kaynak )
ace_HongKongIndependence 10:14

3
Değil absolutely precise, komutu çalıştırmak hala biraz ufacık biraz zaman alacak.
user80551

2
@ user80551 Ve bu yanılıyordun, şimdi her zaman mükemmel kesin. Saatinize bakarsanız, görüntü gözlerinize ulaşmadan önce zaman değişir. Ama şimdi, şimdi her zaman şimdi.
Master117

10
@ user80551 echo "Then"bu gereksinim için çalışıyor.
Taemyr

2
- Neye bakıyorum? Bu ne zaman programda oluyor? -Şimdi! Şimdi bakıyorsunuz efendim, şu anda olan programda şu anda olanları şimdi oluyor. -Ne öyleyse? - Geçti -Ne zaman? -Sadece şimdi
ilmale

20

kıvrılma - ping hızınız ne olursa olsun doğru

curl -s time.nist.gov:13

Güzel, ama UTC'de, yerel saatte olmamalı mı?
orion

24
@ orion Evrende yerel değil miyiz?
Pureferret

Bu, pencerelerin saati senkronize etmek için kullandığı varsayılan 2 sunucudan biridir.
Ismael Miguel

@IsmaelMiguel ayrıca pek çok standart dışı sistem tarafından da kullanılır ..
David Wilkins

Ben sadece söylüyorum. Kullanıldığı tek yer orası değil. Sadece bir gerçeği söylüyorum.
Ismael Miguel

14

piton

Saatin kaç olduğunu bilmediğine emin misin? İşte bir hatırlatma:

print "It's Adventure Time!"

6
Bu zaman clobberin ':)
orion

13

Python 2

Yani, saat doğru, ancak zaman API'si kilitlendi, değil mi? Neden ham bir dosya sistemi zaman damgasını kontrol etmiyorsunuz? Komut beri yerine bir test dosyası oluşturmak yerine, sadece kendi erişim damgası kullanmak sahiptir (Bu derlenmiş olup olmamalarına) çalıştırmak için okunacak. İkincisi için doğru. *

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

Bu kaydedilmeli ve olarak çalıştırılmalıdır t.py. Alternatif olarak, çalışma zamanında komut dosyası adını alın.inspect.getfile(inspect.currentframe())

Not * Bazen bir önceki saniyeye kadar kesindir.


Kontrol etmeli miyiz t.pycyoksa t.pyoyerine?
Kyle Kelley

1
İyi düşünün, ancak bu dosyayı bir modül olarak içe aktarmadıkça (ya da onları manuel olarak oluşturmazsanız) bunlar olmayacak. Yine de kontrol ettim ve python (OS X'te 2.7.2) .py, uygun olsa bile dosyaya dokunacak .pyc. Yani bu her zaman doğru çalışır.
alexis,

Kaydetti ve yükseltildi. Güzel bitti.
Kyle Kelley

10

Yakut

HTTP, ancak yalnızca yanıt meta verilerini kullanıyor.

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

Can pssaati söylemek? Yapabilir!

sleep 1&  ps -o lstart -p $!

İşlem arka planda psbaşlatılır ve işlemin başladığı saati söyler. İşlem arkaplanda başladığından beri sürecin başlangıç zamanı hemen hemen şimdi aynı zamanda.

Dahası, avantaj, zamanın yerel zaman diliminde elde edilmesidir. Ayrıca internet bağlantısına da ihtiyacınız yok!


7

vba

çünkü yapmamalıyım.

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

kullanmak ?DateTimeiçin kullanın, ya da Excel'e yerleştirirseniz, o =DateTime()zaman bir formül olarak çalışacaktır.
Tarih / saat GMT'ye döndürülür - Onu bir dizeden yerel saate dönüştürmek için boşuna bir alıştırma olarak bırakıyorum.


6

Bash + last+ head+cut

İkinciye kesin. lastgünlük dosyasını kullanır/var/log/wtmp

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

EDIT: headSadece bir satıra sınırlandırmak için eklendi .

EDIT: Bu Linux Mint 13 Tarçın 64-bit üzerinde çalışır, ancak bu sizin dağıtımınıza bağlı görünüyor. sysvinit-utils(hangi sağlar last) sürümü (benim durumumda) 2.88dsf-13.10ubuntu11.1 lastokur, /var/log/wtmpbu nedenle sonuçlar bu günlük dosyasına bağlıdır. Aşağıdaki yorumlara bakınız.

DÜZENLEME: Görünüşe göre bu sistem çalışma süresine bağlıdır, bu yüzden burada kanıtı görebilirsiniz http://imgur.com/pqGGPME


Bu burada boş bir satır döndürür. Ve emin adam olarak, oradan çıkarılabilir ilgili birşey duyuyorum last“sistem yeniden her zaman içinde sözde kullanıcı yeniden başlatma günlükleri” diyor (Ve hatta burada doğru gibi görünüyor değil: pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA Aslında -Ftam giriş ve çıkış zamanlarını yazdırır . Geçerli kullanıcı hala oturum açtığından, oturum kapatma zamanı geçerli saattir. Bu Linux Mint 13 tarçın 64 bit üzerinde. Yerel ayarlara bağlı olabilir ama bundan şüpheliyim.
user80551

@manatwork Burada da
user80551

2
Kemer üzerinde kırılmış (sistemd). "Hala çalışıyor" ifadesini döndürür.
orion

5
Aslında, "hala koşmak" en azından felsefi olarak doğru bir zamandır.
orion

5

piton

Nanosaniye hassasiyetine sahip olmak, programın çalışmasının ne zaman başladığını değil, ne zaman başladığını temel almadığı sürece zor olur. Bunu akılda tutarak bir program bittiğinde dayanarak zaman hesaplamak daha mantıklı. Bu, bir programın çalışmayı ne zaman durduğunu ve ekstra hassasiyet elde etmek için kontrol etmemiz gerektiği anlamına gelir.

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

Bunun, python saatinin çalışmadığı sırada, bash saatinin olmadığı veya bash saatinin en azından hangi gün olduğunu bildiğini varsayalım. Değilse, bunu kullanabiliriz:

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

Yine de biraz daha yavaş olabilir. Test etmedim.


5

brainfuck

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

Çıktı:

5PM

Sanırım yazarken Denver’daki zamanı gösteriyor. Alan Jackson'ın buradaki algoritması için açıklama .


xkcd.com/221 ama zamanla görüyorum.
val

@ val Her ikisi de çalışma zamanında sabit hale geldikleri özelliği paylaşır, ancak şarkı doğru. Bir yerlerde saat 5. Yeni geliştiriciler makro genişletme süresinde hesaplama yapmanın zaman kazandırdığını düşündüğü için XKCD olayı çok fazla oluyor.
Sylwester,

Ama bu gerçekten zaman kazandırıyor! Sonuçta çalıştırılabilir aslında.
val

5

Yakut

`date`

Dilin saat / saat API'sini kullanmaz.


Bu tam olarak ne yapar?
Hosch250

1
Kabuktaki date komutunu çalıştırır ve çıktıyı döndürür.
bblack

4

"Bir zaman sunucusundan okumak" fikrini sevdim. Yine de biçimlendirmesini geliştirdi ve eğlenmek için bazı şehirler ekledi.

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

Bu, kendi API'mın saati sorgulamak için çağırdığı varsayımının bozulduğunu varsayıyor, ancak sistemin kendisi zamanla doğru çalışabiliyor.

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

Fikir geçici bir dosya oluşturmak ve NTFS'de 10ms'ye kadar doğru olduğunu düşündüğüm oluşturma süresini okumak. Çıktının biçimlendirmesinin yumuşak olduğunu, ancak tamamen tembel olduğumu unutmayın.

Hemen şimdi makineme çıkın: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader- Bunu üretim kodunda
görmeme

4

Grup, yığın, parça, bir defada alınan miktar

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

Toplu iş dosyasına (kendisine) boş bir satır yazar, ardından dosyanın son yazma zamanını kontrol eder.

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

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

3

HTML, CSS ve Javascript / jQuery

Tamam, teknik olarak bunun bir program olmadığını ve muhtemelen kriterlerin dışında kaldığını biliyorum, ancak yalnızca birkaç saat içinde, bu dünyanın en doğru saati olacak!

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

İlk başta bir while(true)döngü yapacaktım ama sonradan hiçbir tarayıcıyı çökertmek istemediğimi hatırladım ...

İşte eylemdeki bir keman: http://jsfiddle.net/E7Egu/

görüntü tanımını buraya girin


4
flare_points ++;
scunliffe

2 yıl sonra birileri gelir ve aşağı oy verir ... lol
Dryden Long

3

Emacs Lisp

Google şey yapıldı ama emacs değil!

(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
orada birkaç bağımlılığı kaçırdım. Hangi Linux tadı bu?
Charles

1
Eksik olan, / sys / class / rtc / rct0 dizini? Arch Linux'tayım.
Chris

1
evet, işte tüm * nix sistemlerinde yoktur, tüm sistemlerde çok daha az!
Değil Charles

1

JavaScript

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

Saat / saat API'si bozulduğundan, zamanı bulmak için Performans API'sini kullanıyorum . Sonra Datesadece dize ayrıştırmak için kullanılır.


2
Kurallara uygun olup olmadığından emin değilim :)
Oriol

Bu API korkunç bir desteğe sahip.
Ismael Miguel,

1

PHP:

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

Bu, sistem süresini mevcut komut satırı arayüzünden okuyacaktır.

Backtick operatörü bunu yapmak için kullanılır: bir komut çalıştırın.

Başka bir yol olacaktır:

$_SERVER['REQUEST_TIME'];

Komut dosyasının çağrıldığı geçerli saati içeren .


Bu hala zamanla kendi sisteminize bağlı değil mi?
Maurice

2
Sorunun ilk satırı : "Dilinizin saat / saat API'lerinin kırıldığını ve güvenilir olmadıklarını biliyorsunuz." Bunun kendini açıkladığını düşünüyorum.
Ismael Miguel

1

darbe

export PS1="(\t) $PS1"

Kuralların biraz üzerine gelin ama asla bir zaman işlevi denmez. Yine de çıkışta o anki zamanı gösterir ve bundan sonra her vuruşunuz girer.


1

C #

Bu süper kesin yöntem işe yarar - programı 0: 00: 00,0000'da çalıştırmanız şartıyla

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 sadece bir dişlinin parantez içinde belirtilenlerin minimumunda uyuyacağını garanti eder. İsteğe bağlı olarak daha uzun süre uyuyabilir.
Bryan Boettcher

1

Linux, çoğu kabukta, bir RTC ile donanımda:

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

Bu bir tarih / saat API'si çağırmaz mı?
Hosch250

Yankı alt kabuğu parçasını anlamadım. Muhtemelen, sözcük aralığı-boşlukları normalleştirmek istiyorsun, ama öyleyse neden trbit? Belki sadece istersin paste -d' ' /sys/class/rtc/rtc0/{date,time}?
kojiro

Bunu RTC'si olmayan ahududu PI'da denersem ne olur ?!
George

@kojiro Evet ve yolunuz daha temiz.
trav

1

Java

Java Tarih / Saat API'sinin kullanılamaz ve bozuk olduğunu hepimiz biliyoruz. Bu yüzden, (en azından doğrudan) mevcut API’yi kullanmayan bir düzeltme var. Artık saniyeyi bile destekliyor! :) Çıktı UTC'de.

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());        
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.