你能告诉我时间吗?[关闭]


55

您知道您的语言的时钟/时间API已损坏,并且根本不可靠。

因此,不允许您使用任何内置的API访问系统时间/日期。

但是,您也知道您的语言执行日期数学运算并将日期/时间值保留在变量中的能力是正确的。

编写一个可打印当前日期/时间而不调用任何日期/时间/时钟API的程序。例如DateTime.NowGetDate()和类似的功能是不允许的。

多数投票的答案是成功的。

如果是平局,则以更精确的答案为准(即,精确到秒,然后是毫秒,然后是微秒,依此类推)。


2
换句话说,与时间服务器通话?
彼得·泰勒

3
是的,你可以这么做。一种可能的解决方案。
microbian

3
而不是具体的问题。我猜大多数的选票都会通过像这样的答案来收集print(input("Please enter the current time"))
2014年

7
我的钱用于“为不同的语言加载REPL并调用其非中断时间API”。
Jonathan Van Matre 2014年

2
@swich也不允许。因为您的答案将变得不可靠。
microbian

Answers:


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

结果:

enter image description here


enter image description here


49
+1 "There is no sky. Everyone's going to die":D
门把手

6
“每个人都会丧命-否则您的手指就会越过相机。基本上都是一样。”
corsiKa 2014年

请指定Java
2014年

3
这绝对是我的最爱,我只是希望它不会成为决胜局……
Dryden

21
Eclipse呢?与Java开发期间一样,它们可能在这里引起同样多的问题!
再见

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
仅精确到秒...如此精确地推翻其ntp ..可耻的崇拜
大卫·威尔金斯

3
在<CENTER>不能装HE COMES
门把手

@Doorknob我真的需要打印出该帖子并将其挂在我的墙上。
wchargin 2014年

30

重击

像这样?(需要wgetgrep

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

或这个?(需要wgeteog

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/now提供图片的同时http://xkcd.com/now提供网页。
ace_HongKong独立2014年

9
我只是意识到漫画显示的变化取决于一天中的时间。棒极了。
RJFalconer 2014年

2
可惜的是,卡通片没有包含夏令时。(例如,在我撰写本文时,美国东部仅比英国落后四个小时,而不是动画片显示的正常五个小时。)更重要的是,北半球和南半球可能会错位两个小时。
David Richerby 2014年

16
我对xkcd说+1是因为它没有遵守夏令时,希望世界其他地区也照做。
hoosierEE 2014年

29

sh / coreutils

touch . && stat . -c %z

以某种非标准格式输出日期:
YYYY-MM-DD hh:mm:ss.nanoseconds +timezone
尽管我猜可能取决于语言环境。


1
不起作用 它说许可被拒绝 :)
devnull 2014年

5
@devnull您的文件系统已严重损坏。使用cd $(mktemp -d)
mniip 2014年

Meh,dir时间是使用库函数设置的。
纳文2014年

@Navin尚未设置。目录inode刚刚打开以进行写入,并且内核会更新其mtime。有没有明确的 set mtime to this系统调用的任何地方发生的事情
mniip

@mniip Welll,好的。我仍然觉得这touch是一个库函数/命令,因为它具有所需的副作用。
纳文2014年

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仍然是您语言的一部分...但是您仍然获得+1
mniip

为什么呢 是的,请uniqid使用低级时间API,但是即使您从外部服务器请求时间,在某个地方也会有低级时间对时间API的调用……
Michael M.

1
我这里不是在谈论时间API调用。我是说它仍然是语言的一部分。
mniip

2
@mniip是的,但是uniqid()在问这个问题之前就被打破了。在这个问题中只有时钟/时间API中断了
Riking

23

域名解析

我们只是不信任自己的机器吗?如果是这样,这算在内吗?

ssh $othermachine date

如果那不算数,从DNS更新中提取时间肯定可以:

dig stackexchange.com | grep WHEN

23

重击

为了始终绝对准确和正确:

echo "Now"

或激励:

echo "Now, do something useful today"

10
蟾蜍,名词,复数。ob媚的奉承者 sycophant。(来源
ace_HongKong独立

3
absolutely precise,运行命令仍将花费一些时间。
user80551 2014年

2
@ user80551多数民众赞成在你错了,现在总是非常精确。如果您看手表,时间会在图像到达您的眼睛之前改变。但是现在,现在永远都是现在。
Master117 2014年

10
@ user80551 echo "Then"可满足该要求。
塔伊米尔2014年

2
我到底在看什么 什么时候在程序中发生?-现在!您正在查看Now先生,无论程序现在正在发生什么。-然后追加什么?-通过了-什么时候?-现在
ilmale 2014年

20

卷曲-精确到您的ping速率是多少

curl -s time.nist.gov:13

很好,但是在UTC,不是当地时间吗?
Orion 2014年

24
@orion我们不是宇宙的本地人吗?
Pureferret 2014年

这是Windows用于同步时间的2台默认服务器之一。
Ismael Miguel

@IsmaelMiguel它也被许多非标准系统使用。–
David Wilkins

我只是说。我并不是说这是唯一使用它的地方。我只是在说一个事实。
Ismael Miguel 2014年


13

Python 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代替?
凯尔凯利2014年

1
好主意,但是除非您将此文件作为模块导入(或手动创建),否则这些将不存在。无论如何,我检查了一下,.py即使.pyc存在相应的文件,python(在OS X上为2.7.2)也将触摸该文件。因此,这始终可以正常工作。
亚历克西斯

注意并推荐。做得很好。
Kyle Kelley 2014年

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

无法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()则将用作公式。
日期/时间以格林尼治标准时间返回-我将其留为徒劳的练习,无法将其从字符串转换为本地时间


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 2014年

@manatwork它也可以在这里
user80551

2
拱形(systemd)损坏。返回“仍在运行”。
Orion 2014年

5
实际上,从理论上讲,“仍然运行”至少是正确的时间。
Orion 2014年

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

请注意,这是假设当python时钟中断时,bash时钟不在,或者bash时钟至少知道它是星期几。如果没有,我们可以改用:

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

可能会稍微慢一些。我还没有测试。


5

脑干

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

输出:

5PM

我认为在撰写本文时,它显示了丹佛的时间。这个Alan Jackson视频对算法的说明。


xkcd.com/221,但是我知道了。
Val

@val它们都共享在运行时变为常量的属性,但是歌曲是正确的。现在是下午5点。XKCD发生了很多事情,因为新开发人员认为在宏扩展时间中进行计算可以节省时间。
Sylwester

但这确实可以节省时间!实际上产生的可执行文件。
Val

5

红宝石

`date`

不使用该语言的时钟/时间API。


这到底是做什么的?
Hosch250 2014年

1
在shell中执行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。请注意,输出的格式比较复杂,但这纯粹是因为我很懒。

刚才在我的机器上输出: Time is 10:39:45.790


1
// NO ERROR CHECKING - that's left as an exercise for the reader—我最好不要在生产代码中看到这一点
wchargin 2014年

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和Javascript / 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 2014年

我喜欢2年后有人来投票反对这个...哈哈
Dryden Long

3

埃马克斯·利斯普(Emacs Lisp)

谷歌的事情已经完成,但没有在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
错过了那里的一些依赖。那是什么Linux风味?
并不是查尔斯(Charles)

1
/ sys / class / rtc / rct0目录缺少什么?我在Arch Linux上。
克里斯

1
是的,这不是所有* nix系统都没有的,更不用说所有系统了!
并不是查尔斯(Charles)

1

的JavaScript

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

由于时钟/时间API损坏,因此我使用Performance API来获取时间。然后Date仅用于将其解析为字符串。


2
不确定是否符合规则:)
Oriol 2014年

该API有很差劲的支持。
Ismael Miguel

1

PHP:

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

这将从可用的命令行界面读取系统时间。

反引号运算符仅用于执行此操作:运行命令。

另一种方法是:

$_SERVER['REQUEST_TIME'];

其中包含调用脚本的当前时间。


难道这还取决于您自己的系统时间吗?
2014年

2
问题的第一行:“您知道您语言的时钟/时间API已损坏,并且根本不可靠。” 我认为这可以说明问题。
Ismael Miguel 2014年

1

重击

export PS1="(\t) $PS1"

略微限制规则,但从不调用时间函数。但是,它将显示当前退出时间,并且每次您按下Enter键之后。


1

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.Sleep仅保证线程将休眠至少在括号中指定的时间。它可以选择保持更长的睡眠时间。
Bryan Boettcher 2014年

1

Linux,大多数外壳,在带有RTC的硬件上:

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

这不是调用日期/时间API吗?
Hosch250

我没有得到echo subshel​​l位。大概您想对wordplit-spacing进行归一化,但是如果是这样,为什么要这样做tr呢?也许你只是想要paste -d' ' /sys/class/rtc/rtc0/{date,time}
kojiro 2014年

如果我在没有RTC的树莓派PI上尝试了该怎么办?
乔治

@kojiro是的,您的方法更干净。
trav

1

爪哇

我们都知道Java日期/时间API无法使用且已损坏。因此,这是一个不(至少直接)不使用任何现有API的修复程序。它甚至支持leap秒!:)输出为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());        
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.