시간 좀 알려 주 시겠어요? [닫은]


55

언어의 시계 / 시간 API가 손상되어 전혀 신뢰할 수 없음을 알고 있습니다.

따라서 내장 API를 사용하여 시스템 시간 / 날짜에 액세스 할 수 없습니다.

그러나 언어를 사용하여 날짜 계산을 수행하고 변수에 날짜 / 시간 값을 유지하는 기능이 정확하다는 것도 알고 있습니다.

날짜 / 시간 / 시계 API를 호출하지 않고 현재 날짜 / 시간을 인쇄하는 프로그램을 작성하십시오. 예를 들어 DateTime.Now, GetDate()유사한 기능을 사용할 수 없습니다.

대부분의 공감대가있는 답이 이깁니다.

동점 인 경우 더 정밀한 답이 승리합니다 (즉, 최대 초, 밀리 초, 마이크로 초 등).


2
다시 말해, 타임 서버와 대화합니까?
피터 테일러

3
예, 그렇게 할 수 있습니다. 하나의 가능한 해결책.
microbian

3
오히려 구체적이지 않은 질문. 나는 가장 많은 표를와 같은 답변으로 모을 것이라고 생각합니다 print(input("Please enter the current time")).
Howard

7
돈은 "다른 언어로 REPL을로드하고 깨지지 않은 시간 API를 호출하십시오."
Jonathan Van Matre

2
@swich도 허용되지 않습니다. 당신의 대답은 신뢰할 수 없게 될 것이기 때문입니다.
microbian

답변:


121

자바

현재의 거의 모든 솔루션은 로컬 / 원격 컴퓨터가 현재 시간에 대해 거짓말을하지 않는다고 가정합니다 (T-600도 믿을 것입니까?).
시간 계산의 핵심은 순수한 본질을 신뢰하는 것 입니다 .
이 Android 앱은 사용자에게 하늘 사진을 찍도록 요청하며 뛰어난 정밀도로 현재 시간을 예측합니다.

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
   if (resultCode == RESULT_OK) 
   {
      Uri selectedImageUri = data.getData();
      this.imageView.setImageURI(selectedImageUri);

      TimeGuesser guesser = new TimeGuesser(this);
      String result = guesser.guessTimeFromImage(selectedImageUri);
      this.textView.setText(result);   
   }
}

public class TimeGuesser {

    private Context context;
    public TimeGuesser(Context context)
    {
        super();
        this.context = context;
    }

    public String guessTimeFromImage(Uri uri) {
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.context.getContentResolver(), uri);
        } catch (IOException e) {
            return "There is no sky. Everyone's going to die";
        }

        float brightness = getBrightness(bitmap);

        if (brightness < 90.0)
        {
            return "It's sooo late";
        } else {
            return "It's sooo early";
        }
    }

    private float getBrightness(Bitmap bitmap)
    {
        float R, G, B;
        R = G = B = 0.0f;
        int pixelColor;
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int size = width * height;

        for (int x = 0; x < width; ++x) {
            for (int y = 0; y < height; ++y) {
                pixelColor = bitmap.getPixel(x, y);
                R += Color.red(pixelColor);
                G += Color.green(pixelColor);
                B += Color.blue(pixelColor);
            }
        }

        R /= size;
        G /= size;
        B /= size;

        float brightness =  (0.2126f*R ) + (0.7152f*G) + (0.0722f*B);
        return brightness;
    }
}

결과 :

여기에 이미지 설명을 입력하십시오


여기에 이미지 설명을 입력하십시오


49
"There is no sky. Everyone's going to die": D
Doorknob

6
"모두 죽을 것입니다-또는 손가락이 카메라 위에 있습니다. 기본적으로 같은 것입니다."
corsiKa

Java를 지정하십시오
user1886419

3
이것은 확실히 내가 가장 좋아하는 것입니다, 나는 그것이 그것이 타이 브레이커에 오지 않기를 바랍니다 ...
Dryden Long

21
이클립스는 어때? Java 개발 과정에서와 마찬가지로 여기에서도 많은 문제가 발생할 수 있습니다!
bye

64

루비

솔직히 말하자 : 무언가가 stackoverflow.com에 게시 될 때만 시간이 변경됩니다 .)

이 스크립트는 최상위 질문에서 "XYs ago"레이블의 시간을 추출합니다.

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

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

산출:

2014-03-10 18:40:05Z

2
두 번째로만 정확하고 두 번째로 SO가 ntp .. 수치스러운 예배를 핑하는 것
David Wilkins

3
<CENTER> 그가 올 수 없다
손잡이

@Doorknob 정말 그 게시물을 인쇄하고 내 벽에 걸어야합니다.
wchargin 2016 년

30

세게 때리다

이렇게요? ( wget및 필요 grep)

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

몇 분 전에 얻은 결과 :

                    Why am I seeing this message? 
  context.jsonArray.popups.pod_0200.push( {"stringified": "6:08:38 pm GMT\/BST  |  Monday, March 10, 2014","mInput": "","mOutput": "", "popLinks": {} });

아니면 이거? ( wget및 필요 eog)

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

내가 얻는 결과 : ( xkcd 이미지 )

시간대가있는 세계지도 http://c.xkcd.com/redirect/comic/now


@tbodt이 댓글이 표시되는지 확실하지 않습니다. 웹 페이지 http://c.xkcd.com/redirect/comic/nowhttp://xkcd.com/now제공하는 동안 이미지를 제공 하므로 편집 내용이 유효하지 않습니다 .
ace_HongKongIndependence

9
나는 단지 만화가 시간에 따라 변한다는 것을 깨달았습니다. 대단해.
RJFalconer

2
만화가 일광 절약을 포함하지 않는 것은 유감입니다. (예를 들어, 미국 동부에서는 만화가 표시하는 일반적인 5 개가 아니라 영국에서 4 시간 밖에 걸리지 않습니다.) 더 중요하게는 북반구와 남반구가 동기에서 2 시간 이동할 수 있습니다.
David Richerby

16
나는 일광 절약 시간제를 준수 하지 않기 위해 xkcd에 +1을 말하고 , 세계의 나머지 지역이 뒤 따르기를 바랍니다.
hoosierEE

29

sh / coreutils

touch . && stat . -c %z

날짜를 다소 비표준 형식으로 출력합니다
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
. 로케일에 따라 다를 수 있습니다.


1
작동하지 않습니다. 그것은 권한 거부 :)
devnull

5
@devnull 파일 시스템이 심하게 손상되었습니다. 다음으로 수정cd $(mktemp -d)
mniip

Meh, dir 시간은 라이브러리 기능을 사용하여 설정됩니다.
Navin

@Navin 설정되지 않았습니다. 디렉토리 inode가 쓰기 위해 열려 있고 커널이 mtime을 업데이트합니다. 명백한 set mtime to thissyscall은 어디에도 일어나지 않습니다
mniip

@mniip Welll, 알겠습니다. 나는 아직도 그 느낌 touch이 원하는 부작용이 있기 때문에 라이브러리 기능 / 명령입니다.
Navin

25

PHP

uniqid()시간을 기준으로 ID 를 반환하는 사실을 이용 하십시오.

$u=hexdec(substr(uniqid(),0,8));

$y=floor($u/31536000);
$u-=$y*31536000;
$y+=1970;

$d=floor($u/86400);
$u-=$d*86400;

$h=floor($u/3600);
$u-=$h*3600;

$m=floor($u/60);

$s=$u-$m*60;

echo 'Year='.$y.' Days='.$d.' Hours='.$h.' Minutes='.$m.' Seconds='.$s;

테스트하는 동안 : Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49. 형식을 올바르게 지정
하는 date데 사용할 수 있는지 모르겠 으므로 수동으로 변환했습니다.


2
나는 이것이 규칙을 uniqid
기고 있다고 확신

왜 ? 예, uniqid낮은 수준의 시간 API를 사용하지만 외부 서버에서 시간을 요청하는 경우에도 어딘가에 낮은 수준의 API 호출이있을 것입니다.
Michael M.

1
여기에 API 호출 시간에 대해 말하고 있지 않습니다. 나는 그것이 여전히 언어의 일부라고 말하고 있습니다.
mniip

2
@mniip 네,하지만 uniqid()이 질문을하기 전에 깨졌습니다. 이 질문에서 시계 / 시간 API 만 깨짐
Riking

23

DNS

우리는 우리 자신의 기계만을 불신합니까? 그렇다면이 계산이 중요합니까?

ssh $othermachine date

그것이 중요하지 않다면, DNS 업데이트에서 시간을 추출하는 것은 확실히 다음을 수행합니다.

dig stackexchange.com | grep WHEN

23

세게 때리다

항상 정확하고 정확해야합니다.

echo "Now"

또는 동기 부여 :

echo "Now, do something useful today"

10
토디, 명사, 복수의 토디. 불쾌한 아첨꾼; Sycophant. ( 출처 )
ace_HongKongIndependence 22

3
아닙니다 absolutely precise. 명령을 실행하는 데 여전히 약간의 시간이 걸립니다.
user80551

2
@ user80551 그리고 그게 틀렸어, 지금은 항상 완벽하다. 시청 시간을 보면 이미지가 눈에 닿기 전에 변경됩니다. 그러나 지금, 지금은 항상 지금입니다.
Master117

10
@ user80551 echo "Then"은 해당 요구 사항에 적합합니다.
Taemyr

2
내가보고 있는게 뭐야? 이것이 프로그램에서 일어나고 있습니까? -지금! 지금 진행중인 프로그램에서 현재 진행중인 모든 것을 지금보고 있습니다. -무엇에 추가됩니까? -통과-언제? -지금
ilmale

20

컬-핑 속도에 관계없이 정확

curl -s time.nist.gov:13

좋았지 만 UTC로 현지 시간이 아니어야합니까?
오리온

24
@orion 우리는 우주에 국한되지 않습니까?
Pureferret

Windows가 시간을 동기화하는 데 사용하는 2 개의 기본 서버 중 하나입니다.
Ismael Miguel

@IsmaelMiguel 또한 많은 비표준 시스템에서도 사용됩니다.
David Wilkins

나는 단지 말하고있다. 나는 그것이 그것이 사용되는 유일한 장소라고 말하지 않습니다. 나는 단지 사실을 말하고 있습니다.
Ismael Miguel


13

파이썬 2

따라서 시계는 정확하지만 시간 API는 호스입니다. 원시 파일 시스템 타임 스탬프를 확인하십시오. 테스트 파일을 작성하는 대신 스크립트 컴파일해야하더라도 스크립트 읽어야 하므로 자체 액세스 타임 스탬프 만 사용합니다 . 초에 정확합니다. *

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

저장하고로 실행해야합니다 t.py. 또는 런타임시 스크립트 이름을inspect.getfile(inspect.currentframe())

참고 * 때때로 이전 초 까지 정확합니다 .


우리는 확인해야합니까 t.pyc아니면 t.pyo대신 해야합니까 ?
Kyle Kelley

1
좋은 생각이지만이 파일을 모듈로 가져 오거나 수동으로 만들지 않으면 존재하지 않습니다. 어쨌든 내가 확인 .py하면 해당 파일이 있더라도 파이썬 (OS X의 경우 2.7.2)이 파일 을 터치합니다 .pyc. 따라서 이것은 항상 올바르게 작동합니다.
Alexis

주목하고 공감. 잘 했어요
Kyle Kelley

10

루비

HTTP이지만 응답 메타 데이터 만 사용합니다.

require 'uri'
require 'net/http'

def get_now
  uri = URI.parse("http://google.com")
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  rsp = http.request(request)
  rsp['date']
end

9

추신

ps시간을 알 수 없습니까 ? 할 수 있습니다!

sleep 1&  ps -o lstart -p $!

프로세스는 백그라운드에서 시작되며 프로세스가 시작된 ps시간을 알려줍니다. 프로세스가 백그라운드에서 시작 되었으므로 프로세스의 시작 시간은 지금과 거의 같습니다.

또한, 현지 시간대로 시간을 얻는다는 이점이 있습니다. 그리고 인터넷 연결이 필요하지 않습니다!


7

VBA

내가해서는 안되기 때문에.

Public Function DateTime() As String
Dim myNTPsvr As String
Dim dattime As String
Dim oHTTP As Object

myNTPsvr = "time.windows.com"
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://" & myNTPsvr & "/", False
oHTTP.Send

DateTime = oHTTP.GetResponseHeader("Date")

Set oHTTP = Nothing
End Function

사용 ?DateTime하거나 Excel에 넣으면 =DateTime()수식으로 작동합니다.
날짜 / 시간이 GMT로 반환됩니다-문자열에서 현지 시간으로 변환하기위한 연습으로 남겨 둡니다.


6

배쉬 + last+ head+cut

두 번째로 정확합니다. last로그 파일을 사용합니다/var/log/wtmp

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

편집 : head한 줄로 제한되도록 추가되었습니다 .

편집 : 이것은 Linux Mint 13 Cinnamon 64 비트에서 작동하지만 이것이 배포판에 달려있는 것 같습니다. sysvinit-utils( 내 경우 에는 last) 버전을 2.88dsf-13.10ubuntu11.1 last읽으 /var/log/wtmp므로 결과는 해당 로그 파일에 따라 다릅니다. 아래의 의견을 참조하십시오.

편집 : 분명히 이것은 시스템 가동 시간에 달려 있으므로 여기에서 증거를 볼 수 있습니다 http://imgur.com/pqGGPmE


여기에 빈 줄이 반환됩니다. 그리고 나는 확실하지 사람으로, 거기에서 추출 할 수 아무것도 관련입니다 last. "시스템이 재부팅 될 때마다에서 의사 사용자 재부팅 로그"를 말한다 (그리고 심지어 그 여기에 올바른 것 같다하지 : pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA 사실, -F전체 로그인 및 로그 아웃 시간을 인쇄합니다 . 현재 사용자가 여전히 로그인 한 상태에서 로그 아웃 시간은 현재 시간입니다. 이것은 Linux Mint 13 계피 64 비트입니다. 로케일에 따라 다를 수 있지만 의심합니다.
user80551

@manatwork 그것은 여기에서도
user80551

2
아치에서 손상됨 (시스템). "아직 실행 중"을 반환합니다.
오리온

5
실제로, "여전히 달리기"는 적어도 철학적으로 정확한 시간입니다.
오리온

5

파이썬

반환 된 시간이 프로그램이 시작될 때가 아니라 실행이 완료된 시간을 기준으로하지 않는 한 나노초 정밀도를 얻는 것은 까다로울 수 있습니다. 이를 염두에두고 프로그램이 끝나면 시간을 기준으로 계산하는 것이 더 합리적입니다. 이것은 우리가 프로그램의 실행을 멈추고 정밀도를 높이기 위해 제어해야한다는 것을 의미합니다.

import subprocess

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

current_day = next_day = what_day_is_it # It's a bash call, 
while not current_day - next_day:
  next_day = what_day_is_it()
print "It's midnight."
print "Probably."

이것은 파이썬 시계가 붕괴되거나 bash 시계가 아니거나 bash 시계가 적어도 요일을 알고 있다고 가정합니다. 그렇지 않은 경우 대신 다음을 사용할 수 있습니다.

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

그러나 약간 느려질 수 있습니다. 나는 그것을 테스트하지 않았습니다.


5

BrainFuck

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

산출:

5PM

글을 쓰는 시점에서 덴버의 시간을 표시한다고 생각합니다. 이 Alan Jackson 비디오에 의한 알고리즘에 대한 설명 .


xkcd.com/221 그러나 시간, 나는 봅니다.

@val 둘 다 런타임에 일정하게 유지되는 속성을 공유하지만 노래는 정확합니다. 어딘가에 오후 5시입니다. XKCD는 새로운 개발자가 매크로 확장 시간으로 계산하면 시간이 절약된다고 생각하기 때문에 많은 일이 발생합니다.
Sylwester

그러나 실제로 시간을 절약 할 수 있습니다! 실제로 실행 파일이 생성됩니다.

5

루비

`date`

언어의 시계 / 시간 API를 사용하지 않습니다.


정확히 무엇을합니까?
Hosch250

1
쉘에서 date 명령을 실행하고 출력을 리턴합니다.
bblack

4

"시간 서버에서 읽는 것"아이디어가 마음에 들었습니다. 그러나 형식을 개선하고 재미를 위해 일부 도시를 추가했습니다.

PHP

$page = file_get_contents("http://www.timeapi.org/utc/now");
echo "In London: ".date("H:i:s - jS F, Y", strtotime($page))."<br>";
echo "In Rome: ".date("H:i:s - jS F, Y", strtotime($page)+3600)."<br>";
echo "In Athens: ".date("H:i:s - jS F, Y", strtotime($page)+7200)."<br>";


4

C / WinAPI

이것은 시계를 쿼리하기위한 내 자신의 API 호출이 손상되었다고 가정하지만 시스템 자체는 시간과 올바르게 작동 할 수 있습니다.

// NO ERROR CHECKING - that's left as an exercise for the reader
TCHAR tmpfilename[MAX_PATH];
TCHAR tmpfilepath[MAX_PATH];

// get some information to create a temporary file
DWORD dwRes = GetTempPath(MAX_PATH, tmpfilepath);
UINT uiRes  = GetTempFileName(tmpfilepath, TEXT("golftime"), 0, tmpfilename);

// create the file
HANDLE hTempFile = CreateFile(tmpfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

// read the creation time of the file. accuracy is to, uhm... 10ms on NTFS?
FILETIME created;
GetFileTime(hTempFile, &created, NULL, NULL);

// convert the filetime to a system time (in UTC)
SYSTEMTIME systime;
FileTimeToSystemTime(&created, &systime);

std::cout << "Time is " <<
    systime.wHour << ":" << systime.wMinute << ":" << systime.wSecond << "." << systime.wMilliseconds << "\n";

// close the file and delete
CloseHandle(hTempFile);
DeleteFile(tmpfilename);

아이디어는 임시 파일을 작성하고 작성 시간을 읽는 것입니다. NTFS에서는 10ms까지 정확하다고 생각합니다. 출력 형식은 iffy이지만 순전히 게으른 것입니다.

지금 내 컴퓨터에서 출력 : Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader— 나는 이것을 프로덕션 코드에서 더 잘 보지 못한다
wchargin

4

일괄

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

빈 줄을 배치 파일 (자체)에 쓴 다음 파일의 마지막 쓰기 시간을 확인합니다.

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

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

3

HTML, CSS 및 자바 스크립트 / jQuery

자, 이것은 기술적으로 프로그램이 아니며, 아마도 기준을 벗어 났을 것입니다. 그러나 단 몇 시간 만에 세계에서 가장 정확한 시계가 될 것입니다!

CSS

@font-face {
    font-family:"DSDIGI";
    src:url("http://fontsforweb.com/public/fonts/1091/DSDIGI.eot") format("eot"),
    url("http://fontsforweb.com/public/fonts/1091/DSDIGI.ttf") format("truetype");
    font-weight:normal;
    font-style:normal;
}
#backer {
    background-image: url('http://i.imgur.com/w3W5TPd.jpg');
    width: 450px;
    height: 354px;
    color: red;
    font-family: 'DSDIGI';
}
#backer p {
    width: 100%;
    display: block;
    line-height: 325px;
    font-size: 60px;
}

HTML

<div id="backer">
    <p>
        BEER<span id="fade">:</span>30
    </p>
</div>

jQuery

function start() {
    $('#fade').fadeOut(function() {
        $('#fade').fadeIn();
    });
    setTimeout(start, 1000);
}
start();

처음에는 while(true)루프 를 수행하려고 했지만 브라우저를 중단하고 싶지 않다는 것을 기억했습니다 ...

여기에 그것의 바이올린이 있습니다 : http://jsfiddle.net/E7Egu/

여기에 이미지 설명을 입력하십시오


4
flare_points ++;
scunliffe

나는 2 년 후 누군가가 와서 투표를하는 것을 좋아합니다 ... lol
Dryden Long

3

이맥스 리스프

Google 일이 완료되었지만 emacs에서는 수행되지 않았습니다!

(url-retrieve "http://www.google.com/search?q=time" (lambda(l)            
        (search-forward-regexp "[0-9]?[0-9]:[0-9][0-9][ap]m")
        (print (buffer-substring (point) (1+ (search-backward ">"))))))

2

node.js / 자바 스크립트

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
거기에 몇 명의 부양가를 놓쳤다. 그게 무슨 리눅스 맛입니까?
찰스

1
/ sys / class / rtc / rct0 디렉토리가 무엇입니까? 아치 리눅스를 사용하고 있습니다.
Chris

1
그렇습니다. 모든 * nix 시스템에는없는 시스템입니다.
Charles

1

자바 스크립트

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

시계 / 시간 API가 손상되었으므로 Performance API 를 사용 하여 시간을 얻습니다. 그런 다음 Date문자열로 구문 분석하는 데만 사용됩니다.


2
그것이 규칙에 맞는지 확실하지 않습니다 :)
Oriol

그 API는 끔찍한 지원을합니다.
Ismael Miguel

1

PHP :

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

사용 가능한 명령 행 인터페이스에서 시스템 시간을 읽습니다.

backtick 연산자를 사용하여 명령을 실행하십시오.

다른 방법은 다음과 같습니다.

$_SERVER['REQUEST_TIME'];

어느 포함 현재 스크립트가 호출되는 시간.


그것은 여전히 ​​당신의 시스템에 의존하지 않습니까?
Maurice

2
질문의 첫 줄 : "언어의 시계 / 시간 API가 깨져서 전혀 신뢰할 수 없다는 것을 알고 있습니다." 나는 이것이 그 자체를 설명한다고 생각합니다.
Ismael Miguel

1

세게 때리다

export PS1="(\t) $PS1"

규칙을 약간 바꾸지 만 시간 함수를 호출하지는 않습니다. 종료시 현재 시간을 표시하고 그 후에 Enter 키를 누를 때마다 표시됩니다.


1

씨#

0 : 00 : 00,0000에 프로그램을 실행하면이 정확한 방법이 작동합니다.

using System;
using System.Threading;

namespace ConsoleApplication1 {
  class Program {
    private static volatile int s_Hour;
    private static volatile int s_Minute;
    private static volatile int s_Second;
    private static volatile int s_Millisecond;

    class Looper {
      public int Length { get; set; }
      public Action Update { get; set; }
    }

    static void Loop(object args) {
      var looper = (Looper)args;
      while (true) {
        Thread.Sleep(looper.Length);
        looper.Update.Invoke();
      }
    }

    static void Main(string[] args) {
      var starter = new ParameterizedThreadStart(Loop);
      new Thread(starter).Start(new Looper { Length = 100, Update = () => { s_Millisecond = (s_Millisecond + 100) % 1000; } });
      new Thread(starter).Start(new Looper { Length = 1000, Update = () => { s_Second = (s_Second + 1) % 60; } });
      new Thread(starter).Start(new Looper { Length = 60 * 1000, Update = () => { s_Minute = (s_Minute + 1) % 60; } });
      new Thread(starter).Start(new Looper { Length = 60 * 60 * 1000, Update = () => { s_Hour++; } });

      Console.Out.WriteLine(@"Press e to exit, enter to write current time...");
      while (true) {
        string input = Console.In.ReadLine();
        if (input == "e") {
          Environment.Exit(0);
          return;
        }
        Console.Out.WriteLine("{0:00}:{1:00}:{2:00},{3}", s_Hour, s_Minute, s_Second, s_Millisecond);
      }
    }
  }
}

Thread.Sleep은 괄호 안에 지정된 것 이상으로 스레드가 휴면 상태를 유지하도록 보장합니다. 선택적으로 훨씬 더 오랫동안 수면을 유지할 수 있습니다.
Bryan Boettcher 2014 년

1

RTC가있는 하드웨어의 Linux (대부분의 쉘) :

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

날짜 / 시간 API를 호출하지 않습니까?
Hosch250

에코 서브 쉘 비트를 얻지 못했습니다. 아마도 당신은 단어 간격 간격을 정규화하고 싶을 것입니다. 그렇다면 왜 tr비트가 있습니까? 어쩌면 당신은 단지 원하는가 paste -d' ' /sys/class/rtc/rtc0/{date,time}?
kojiro

RTC가없는 라즈베리 PI에서 이것을 시도하면 어떻게 되나요?!
George

@ kojiro 네, 그리고 당신의 방법은 더 깨끗합니다.
trav

1

자바

우리 모두는 Java Date / Time API를 사용할 수없고 깨 졌다는 것을 알고 있습니다. 따라서 여기에 기존 API를 사용하지 않는 수정 사항이 있습니다. 윤초도 지원합니다! :) 출력은 UTC입니다.

import java.lang.reflect.Field;
import java.net.HttpCookie;
import java.util.*;

public class FixedTimeAPI4Java {

    private static final List<Integer> MONTHS_WITH_30_DAYS = Arrays.asList(4, 6, 9, 11);
    private static final List<Integer> YEARS_WITH_LEAP_SECOND_IN_DECEMBER = Arrays.asList(1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1987, 1989, 1990, 1995, 1998, 2005, 2008);
    private static final List<Integer> YEARS_WITH_LEAP_SECOND_IN_JUNE =  Arrays.asList(1972, 1981, 1982, 1983, 1985, 1992, 1993, 1994, 1997, 2012);

    /**
    * Returns the UTC time, at the time of method invocation, with millisecond
    * precision, in format <code>yyyy-MM-dd HH:mm:ss.SSS</code>.
    */
    public String getTime() throws Exception {

        // The cookie is only used for accessing current system time
        HttpCookie cookie = new HttpCookie("Offline", "Cookie");
        Field created = HttpCookie.class.getDeclaredField("whenCreated");
        created.setAccessible(true);

        long millisecondsSinceEpoch = created.getLong(cookie);        
        long fullSecondsSinceEpoch = millisecondsSinceEpoch / 1000L; 

        int year = 1970, month = 1, dayOfMonth = 1, hour = 0, minute = 0, second = 0,
            millisecond = (int)(millisecondsSinceEpoch - (fullSecondsSinceEpoch * 1000L));

        ticks: 
        for (;; year++) {
            for (month = 1; month <= 12; month++) {
                for (dayOfMonth = 1; dayOfMonth <= daysInMonth(month, year); dayOfMonth++) {
                    for (hour = 0; hour < 24; hour++) {
                        for (minute = 0; minute < 60; minute++) {
                            for (second = 0; second < secondsInMinute(minute, hour, dayOfMonth, month, year); second++, fullSecondsSinceEpoch--) {
                                if (fullSecondsSinceEpoch == 0) {
                                    break ticks;
                                }
                            }
                        }
                    }
                }
            }
        }
        return String.format("%04d-%02d-%02d %02d:%02d:%02d.%03d", year, month,
            dayOfMonth, hour, minute, second, millisecond);
    }

    /**
     * Returns the seconds in the given minute of the given hour/day/month/year,
     * taking into account leap seconds that can be added to the last minute of
     * June or December.
     */
    private static int secondsInMinute(int minute, int hour, int day, int month, int year) {
        return (minute == 59 && hour == 23 && ((day == 30 && month == 6) || (day == 31 && month == 12))) 
                ? 60 + leapSecondsInMonth( month, year) 
                : 60;
    }

    /**
     * Returns the number of days in the given month of the given year.
     */
    private static int daysInMonth(int month, int year) {
        return month == 2 ? isLeapYear(year) ? 29 : 28
                : MONTHS_WITH_30_DAYS.contains(month) ? 30
                    : 31;
    }

    /** 
     * Returns whether the given year is a leap year or not. 
     * A leap year is every 4th year, but not if the year is divisible by 100, unless if it's divisible by 400.
     */
    private static boolean isLeapYear(int year) {
        return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? true : false;
    }

    /** 
     * Returns the number of leap seconds that were added to UTC time at the end of the given month and year.
     * Leap seconds are added (by the decison of International Earth Rotation Service / Paris Observatory)
     * in order to keep UTC within 0.9 seconds of international atomic time (TAI).
     * <p>TODO: implement parser for updated list at http://www.ietf.org/timezones/data/leap-seconds.list :)
     */
    private static int leapSecondsInMonth(int month, int year) {        
        return (year < 1972 || year > 2012) ? 0
                : (month == 6 && YEARS_WITH_LEAP_SECOND_IN_JUNE.contains(year)) ? 1
                    : (month == 12 && YEARS_WITH_LEAP_SECOND_IN_DECEMBER.contains(year)) ? 1
                        : 0;
    }

    public final static void main(String[] args) throws Exception {
        System.out.println(new FixedTimeAPI4Java().getTime());        
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.