Bạn có thể vui lòng cho tôi biết thời gian? [đóng cửa]


55

Bạn biết rằng API đồng hồ / thời gian của ngôn ngữ của bạn bị hỏng và chúng không đáng tin cậy chút nào.

Vì vậy, bạn không được phép sử dụng bất kỳ API tích hợp nào để truy cập thời gian / ngày của hệ thống.

Nhưng bạn cũng biết rằng khả năng ngôn ngữ của bạn để thực hiện toán ngày và giữ lại giá trị ngày / giờ trong một biến là chính xác.

Viết chương trình in ngày / giờ hiện tại mà không cần gọi bất kỳ API ngày / giờ / đồng hồ nào. Ví dụ DateTime.Now, GetDate()và các chức năng tương tự không được phép.

Câu trả lời với hầu hết các chiến thắng.

Trong trường hợp hòa, câu trả lời có độ chính xác cao hơn sẽ thắng (nghĩa là chính xác đến giây, sau đó là mili giây, sau đó là micro giây, v.v.).


2
Nói cách khác, nói chuyện với một máy chủ thời gian?
Peter Taylor

3
Đúng, bạn có thể làm điều đó. Một giải pháp có thể.
microbian

3
Câu hỏi khá không cụ thể. Tôi đoán hầu hết các phiếu sẽ được thu thập bởi một câu trả lời như thế nào print(input("Please enter the current time")).
Howard

7
Tiền của tôi là vào "Tải REPL cho các ngôn ngữ khác nhau và gọi API thời gian không bị hỏng".
Jonathan Van Matre

2
@swich mà cũng không được phép. Bởi vì câu trả lời của bạn sẽ trở nên không đáng tin cậy.
microbian

Câu trả lời:


121

Java

Hầu như tất cả các giải pháp hiện tại đều cho rằng máy tính cục bộ / từ xa không nói dối về thời điểm hiện tại (bạn có tin T-600 không?).
Điểm quan trọng trong tính toán thời gian là tin tưởng vào một bản chất thuần túy .
Ứng dụng Android này yêu cầu người dùng chụp ảnh bầu trời và dự đoán thời gian hiện tại với độ chính xác vượt trội:

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

Các kết quả:

nhập mô tả hình ảnh ở đây


nhập mô tả hình ảnh ở đây


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

6
"Mọi người sẽ chết - hoặc ngón tay của bạn ở trên máy ảnh. Về cơ bản là điều tương tự."
corsiKa

Vui lòng chỉ định Java
user1886419

3
Đây chắc chắn là sở thích của tôi, tôi chỉ hy vọng nó không rơi vào một cái máy bẻ khóa ...
Dryden Long

21
Thế còn Eclipses? Chúng có khả năng gây ra nhiều vấn đề ở đây cũng như trong quá trình phát triển Java!
tạm biệt

64

Hồng ngọc

Hãy trung thực: thời gian chỉ thay đổi khi một cái gì đó được đăng trên stackoverflow.com ;)

Kịch bản trích xuất thời gian của nhãn "XYs trước" trong câu hỏi cao nhất.

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

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

Đầu ra:

2014-03-10 18:40:05Z

2
Chỉ chính xác đến lần thứ hai ... và lần thứ hai mà SO đưa ra ntp của mình .. sự thờ phượng đáng xấu hổ
David Wilkins

3
THE <CENTER> KHÔNG THỂ GIỮ HE COMES
tay nắm cửa

@Doorknob Tôi thực sự cần in ra bài đăng đó và treo nó trên tường của tôi.
wchargein

30

Bash

Như thế này? (yêu cầu wgetgrep)

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

Đầu ra tôi nhận được một vài phút trước đây:

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

Hay cái này? (yêu cầu wgeteog)

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

Đầu ra tôi nhận ngay: (Ảnh của xkcd )

bản đồ thế giới với múi giờ http://c.xkcd.com/redirect/comic/now


@tbodt Không chắc bạn có xem bình luận này không. Chỉnh sửa của bạn không hợp lệ vì http://c.xkcd.com/redirect/comic/nowcung cấp một hình ảnh trong khi http://xkcd.com/nowcung cấp một trang web.
ace_HongKongInependence

9
Tôi chỉ nhận ra rằng truyện tranh hiển thị thay đổi tùy thuộc vào thời gian trong ngày. Thật tuyệt vời.
RJFalconer

2
Thật đáng tiếc khi phim hoạt hình không kết hợp tiết kiệm ánh sáng ban ngày. (Ví dụ, miền đông Hoa Kỳ chỉ sau Vương quốc Anh bốn giờ khi tôi viết bài này, không phải năm giờ bình thường mà phim hoạt hình thể hiện.) Đáng kể hơn, bán cầu bắc và nam có thể di chuyển hai giờ đồng bộ.
David Richerby

16
Tôi nói +1 đến xkcd vì không quan sát thời gian tiết kiệm ánh sáng ban ngày và hy vọng phần còn lại của thế giới sẽ làm theo.
hoosierEE

29

sh / coreutils

touch . && stat . -c %z

Xuất ra ngày ở định dạng hơi không chuẩn:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
Mặc dù tôi đoán nó có thể phụ thuộc vào miền địa phương.


1
Không hoạt động. Nó nói sự cho phép bị từ chối :)
devnull

5
@devnull hệ thống tập tin của bạn bị hỏng khủng khiếp. Khắc phục sự cố vớicd $(mktemp -d)
mniip 11/03/2016

Meh, thời gian dir được thiết lập bằng cách sử dụng chức năng thư viện.
Navin

@Navin Nó không được đặt. Thư mục inode chỉ được mở để ghi và kernel cập nhật mtime của nó. Không có set mtime to this
tòa nhà cao tầng

@mniip Vâng, được rồi. Tôi vẫn cảm thấy đó touchlà một chức năng / lệnh của thư viện vì nó có tác dụng phụ mong muốn.
Navin

25

PHP

Khai thác thực tế uniqid()trả về một ID dựa trên thời gian.

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

Trong quá trình thử nghiệm của tôi, nó đã trở lại : Year=2014 Days=79 Hours=18 Minutes=9 Seconds=49.
Tôi không biết liệu tôi có thể sử dụng dateđể định dạng chính xác hay không, vì vậy tôi đã chuyển đổi thủ công.


2
Tôi chắc chắn rằng điều này đang bẻ cong các quy tắc ... uniqidvẫn là một phần trong ngôn ngữ của bạn ... Nhưng bạn vẫn nhận được +1
mniip

Tại sao ? có, uniqidsử dụng API thời gian cấp thấp nhưng ngay cả khi bạn yêu cầu thời gian từ máy chủ bên ngoài, sẽ có một cuộc gọi API thời gian ở mức độ thấp ở đâu đó ...
Michael M.

1
Tôi không nói về các cuộc gọi API thời gian ở đây. Tôi đang nói rằng nó vẫn là một phần của ngôn ngữ.
mniip

2
@mniip có, nhưng uniqid()đã bị hỏng trước khi câu hỏi này thậm chí được hỏi. chỉ các API đồng hồ / thời gian bị hỏng trong câu hỏi này
Đi xe đạp vào

23

DNS

Có phải chúng ta chỉ nghi ngờ máy của chính mình? Nếu vậy, điều này có tính không?

ssh $othermachine date

Nếu điều đó không được tính, thời gian trích xuất từ ​​bản cập nhật DNS chắc chắn sẽ:

dig stackexchange.com | grep WHEN

23

Bash

Chỉ cần luôn luôn chính xác và chính xác:

echo "Now"

hoặc thúc đẩy:

echo "Now, do something useful today"

10
toady, danh từ, số nhiều toadies. Một kẻ tâng bốc đáng ghét; chất tuần hoàn. ( Nguồn )
ace_HongKongInependence

3
Không absolutely precise, chạy lệnh vẫn sẽ mất một chút thời gian.
dùng80551

2
@ user80551 Và đó là bạn đã sai, bây giờ luôn hoàn toàn chính xác. Nếu bạn nhìn vào thời gian đồng hồ của bạn thay đổi trước khi hình ảnh đến mắt bạn. Nhưng bây giờ, bây giờ luôn là bây giờ.
Master 117

10
@ user80551 echo "Then"hoạt động cho yêu cầu đó.
Taemyr

2
-Tôi đang nhìn cái quái gì vậy? Khi điều này xảy ra trong chương trình? -Hiện nay! Bạn đang nhìn vào bây giờ thưa ông, bất cứ điều gì nó đang xảy ra trong chương trình bây giờ nó đang diễn ra. -Những gì nối vào sau đó? -Đã qua rồi -Khi nào? -Chỉ cần ngay bây giờ
ilmale

20

curl - chính xác cho dù tốc độ ping của bạn là gì

curl -s time.nist.gov:13

Đẹp, nhưng đó là ở UTC, không nên ở trong giờ địa phương?
orion

24
@orion Chúng ta không phải là người địa phương trong vũ trụ?
Pureferret

Đây là một trong 2 máy chủ mặc định mà windows sử dụng để đồng bộ hóa thời gian.
Ismael Miguel

@IsmaelMiguel nó cũng được sử dụng bởi nhiều hệ thống không chuẩn ..
David Wilkins

Tôi chỉ nói. Tôi không nói đó là nơi duy nhất được sử dụng. Tôi chỉ nói một sự thật.
Ismael Miguel

14

Con trăn

Bạn có chắc là bạn không biết mấy giờ rồi không?!? Đây là một lời nhắc nhở:

print "It's Adventure Time!"

6
Đó là thời gian của clobberin :)
orion

13

Con trăn 2

Vì vậy, đồng hồ là chính xác nhưng API thời gian bị hos, phải không? Tại sao không kiểm tra dấu thời gian của hệ thống tập tin thô. Thay vì tạo ra một tập tin kiểm tra, chúng tôi chỉ sử dụng dấu thời gian truy cập của riêng của chúng tôi kể từ khi kịch bản được đọc để chạy (ngay cả khi nó được biên soạn). Chính xác đến lần thứ hai. *

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

Điều này nên được lưu và chạy như t.py. Thay phiên, lấy tên tập lệnh trong thời gian chạy vớiinspect.getfile(inspect.currentframe())

Lưu ý * Đôi khi chính xác đến giây trước .


Chúng ta nên kiểm tra t.pychay t.pyothay vào đó?
Kyle Kelley

1
Suy nghĩ tốt nhưng chúng sẽ không tồn tại trừ khi bạn nhập tệp này dưới dạng mô-đun (hoặc tạo thủ công). Dù sao tôi đã kiểm tra và python (2.7.2 trên OS X) sẽ chạm vào .pytệp ngay cả khi có tương ứng .pyc. Vì vậy, điều này luôn luôn hoạt động chính xác.
alexis

Lưu ý và nâng cao. Hoàn thành tốt
Kyle Kelley

10

Hồng ngọc

HTTP, nhưng chỉ sử dụng phản hồi siêu dữ liệu.

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

Không thể psnói thời gian? Nó có thể!

sleep 1&  ps -o lstart -p $!

Quá trình được bắt đầu trong nền và pscho biết thời gian quá trình bắt đầu. Kể từ khi quá trình bắt đầu trong nền, thời gian bắt đầu của quá trình gần giống như bây giờ.

Hơn nữa, lợi thế là thời gian có được theo múi giờ địa phương. Và bạn cũng không cần kết nối internet!


7

vba

bởi vì tôi không nên

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

sử dụng ?DateTimeđể sử dụng hoặc nếu bạn đặt nó vào Excel, thì nó =DateTime()sẽ hoạt động như một công thức.
Ngày / giờ được trả về theo GMT - Tôi để nó như một bài tập vô ích để chuyển đổi nó từ chuỗi sang giờ địa phương


6

Bash + last+ head+cut

Chính xác đến lần thứ hai. lastsử dụng tệp nhật ký/var/log/wtmp

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

EDIT: Đã thêm headđể giới hạn chỉ một dòng.

EDIT: Điều này hoạt động trên Linux Mint 13 Cinnamon 64-bit nhưng có vẻ như điều này phụ thuộc vào bản phân phối của bạn. sysvinit-utils(cung cấp last) phiên bản được 2.88dsf-13.10ubuntu11.1 lastđọc từ /var/log/wtmp(trong trường hợp của tôi) vì vậy kết quả phụ thuộc vào tệp nhật ký đó. Xem bình luận bên dưới.

EDIT: Rõ ràng điều này phụ thuộc vào thời gian hoạt động của hệ thống để bạn có thể xem bằng chứng tại đây http://imgur.com/pqGGPmE


Điều đó trả về một dòng trống ở đây. Và tôi không chắc chắn bất cứ điều gì có liên quan có thể được trích xuất từ ​​đó, như người đàn ông lastnói, người dùng giả mạo Nhật ký khởi động lại mỗi khi hệ thống được khởi động lại., (Và thậm chí điều đó dường như không chính xác ở đây: pastebin.com/ArUaBcuY )
manatwork

@manatwork imgur.com/SeJX9RA Trên thực tế, -Fin toàn bộ thời gian đăng nhập và đăng xuất . Vì người dùng hiện tại vẫn đang đăng nhập, thời gian đăng xuất là thời gian hiện tại. Đây là trên Linux Mint 13 quế 64 bit. Nó có thể là phụ thuộc địa phương nhưng tôi nghi ngờ nó.
dùng80551

@manatwork Nó cũng hoạt động ở đây
user80551

2
Bị hỏng trên vòm (systemd). Trả về "vẫn đang chạy".
orion

5
Trên thực tế, "vẫn đang chạy" ít nhất là về mặt triết học là một thời điểm chính xác.
orion

5

Con trăn

Lấy độ chính xác nano giây sẽ rất khó trừ khi thời gian trả về được dựa trên khi chương trình kết thúc chạy, chứ không phải khi nó bắt đầu. Với ý nghĩ đó, việc tính toán thời gian dựa trên khi chương trình kết thúc sẽ có ý nghĩa hơn. Điều này có nghĩa là chúng ta nên kiểm soát khi một chương trình ngừng chạy để có thêm độ chính xác.

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

Lưu ý điều này giả sử trong khi đồng hồ trăn bị hỏng, đồng hồ bash không hoặc đồng hồ bash ít nhất biết đó là ngày nào. Nếu không, chúng ta có thể sử dụng cái này:

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

Có thể chậm hơn một chút, mặc dù. Tôi đã không kiểm tra nó.


5

BrainFuck

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

Đầu ra:

5PM

Tôi nghĩ rằng nó hiển thị thời gian ở Denver tại thời điểm viết. Giải thích cho thuật toán ở đây bởi video Alan Jackson này .


xkcd.com/221 nhưng theo thời gian, tôi thấy.
val

@val Cả hai đều chia sẻ tài sản mà họ trở thành không đổi trong thời gian chạy, nhưng bài hát là chính xác. Bây giờ là 5 giờ chiều. Điều XKCD xảy ra rất nhiều vì các nhà phát triển mới nghĩ rằng tính toán trong thời gian mở rộng macro giúp tiết kiệm thời gian.
Sylwester

Nhưng nó thực sự tiết kiệm thời gian! Trong kết quả thực thi thực tế.
val

5

Hồng ngọc

`date`

Không sử dụng API đồng hồ / thời gian của ngôn ngữ.


Chính xác thì nó làm gì?
Hosch250

1
Thực hiện lệnh date trong shell và trả về đầu ra.
bblack

4

Tôi thích ý tưởng "đọc từ máy chủ thời gian". Cải thiện định dạng của nó mặc dù, và thêm một số thành phố cho vui.

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

Điều này làm cho giả định rằng các lệnh gọi API của riêng tôi để truy vấn đồng hồ bị hỏng, nhưng bản thân hệ thống có thể hoạt động chính xác với thời gian.

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

Ý tưởng là tạo một tệp tạm thời và đọc thời gian tạo, trên NTFS tôi nghĩ là chính xác đến 10ms. Lưu ý rằng định dạng của đầu ra là iffy, nhưng đó hoàn toàn là do tôi lười biếng.

Đầu ra trên máy của tôi vừa rồi: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader- Tôi tốt hơn không thấy điều này trong mã sản xuất
wchargein

4

Mẻ

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

Viết một dòng trống vào tệp bó (chính nó), sau đó kiểm tra thời gian ghi cuối cùng của tệp.

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

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

3

HTML, CSS & Javascript / jQuery

Ok, vì vậy tôi biết đây không phải là một chương trình, và có lẽ nằm ngoài các tiêu chí, nhưng chỉ trong vài giờ nữa, đây sẽ là chiếc đồng hồ chính xác nhất trên thế giới!

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

Lúc đầu, tôi sẽ thực hiện một while(true)vòng lặp, nhưng sau đó nhớ rằng tôi không muốn làm sập bất kỳ trình duyệt nào ...

Đây là một mẹo nhỏ của nó trong hành động: http://jsfiddle.net/E7Egu/

nhập mô tả hình ảnh ở đây


4
flare_point ++;
scunliffe

Tôi thích rằng 2 năm sau có người đến và bỏ phiếu này ... lol
Dryden Long

3

Emacs Lisp

Điều google đã được thực hiện nhưng không phải trong 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
bỏ lỡ một vài phụ thuộc ở đó. Hương vị Linux là gì?
Không phải là Charles

1
Thiếu gì, thư mục / sys / class / rtc / rct0? Tôi đang dùng Arch Linux.
Chris

1
vâng, đó là những gì không có trên tất cả các hệ thống * nix, ít hơn tất cả các hệ thống!
Không phải Charles

1

JavaScript

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

Vì API đồng hồ / thời gian bị hỏng, tôi sử dụng API hiệu suất để lấy thời gian. Sau đó, Datechỉ được sử dụng để phân tích nó thành chuỗi.


2
Không chắc chắn nếu nó phù hợp với các quy tắc :)
Oriol

API đó có một sự hỗ trợ khủng khiếp.
Ismael Miguel

1

PHP:

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

Điều này sẽ đọc thời gian hệ thống từ giao diện dòng lệnh có sẵn.

Toán tử backtick được sử dụng để làm việc đó: chạy một lệnh.

Một cách khác sẽ là:

$_SERVER['REQUEST_TIME'];

Trong đó có chứa thời gian hiện tại mà tập lệnh được gọi.


Điều đó có còn phụ thuộc vào hệ thống của bạn không?
Maurice

2
Dòng thứ nhất của câu hỏi : "Bạn biết rằng API đồng hồ / thời gian của ngôn ngữ của bạn bị hỏng và chúng không đáng tin cậy chút nào." Tôi nghĩ rằng điều này giải thích chính nó.
Ismael Miguel

1

Bash

export PS1="(\t) $PS1"

Bỏ qua các quy tắc một chút, nhưng nó không bao giờ gọi hàm thời gian. Nó sẽ hiển thị thời gian hiện tại khi thoát, và mỗi lần bạn nhấn enter sau đó.


1

C #

Phương pháp siêu chính xác này sẽ hoạt động - miễn là bạn sẽ chạy chương trình lúc 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.S ngủ chỉ đảm bảo một chủ đề sẽ ngủ tối thiểu những gì được chỉ định trong ngoặc đơn. Nó có thể tùy chọn ở lại ngủ lâu hơn nhiều.
Bryan Boettcher

1

Linux, hầu hết các hệ vỏ, trên phần cứng có RTC:

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

Điều này không gọi API ngày / giờ sao?
Hosch250

Tôi không nhận được bit subshell echo. Có lẽ bạn muốn bình thường hóa khoảng cách từ, nhưng nếu vậy, tại sao lại làm trbit? Có lẽ bạn chỉ muốn paste -d' ' /sys/class/rtc/rtc0/{date,time}?
kojiro

Điều gì sẽ xảy ra nếu tôi thử điều này trên PI mâm xôi, không có RTC?!
George

@kojiro Vâng, và cách của bạn sạch sẽ hơn.
trav

1

Java

Chúng ta đều biết API Ngày / Giờ Java không sử dụng được và bị hỏng. Vì vậy, đây là một bản sửa lỗi không (ít nhất là trực tiếp) sử dụng bất kỳ API hiện có nào. Nó thậm chí còn hỗ trợ giây nhuận! :) Đầu ra là trong 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());        
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.