[#6862] Re: http_get.rb — 青山 和光 <PXN11625@...>

In-Reply-To: [ruby-list:6844] Re: http_get.rb

15 messages 1998/03/01

[#6906] ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...>

藤本です、こんにちは。

25 messages 1998/03/03
[#6907] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/03

まつもと ゆきひろです

[#6908] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6911] Re: ruby's Icon ? — OZAWA Sakuro <ozawa@...> 1998/03/03

小澤さくです。

[#6912] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6914] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんばんは。

[#6918] manual 1.18b index — WATANABE Tetsuya <tetsu@...>

ruby-man-1.1b8 で、name タグがついているものを拾い集めて

17 messages 1998/03/04
[#6921] Re: manual 1.18b index — matz@... (Yukihiro Matsumoto) 1998/03/04

まつもと ゆきひろです

[#6954] Re: ruby's Icon ? — nosuzuki@... (Norio Suzuki)

こんばんは。鈴木教郎です。

18 messages 1998/03/04
[#6964] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/05

まつもと ゆきひろです

[#7023] infinity — Tadayoshi Funaba <tadf@...>

ふなばです。

41 messages 1998/03/09
[#7029] Re: infinity — shugo@... (Shugo Maeda) 1998/03/09

前田です。

[#7033] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/09

けいじゅ@日本ラショナルソフトウェアです.

[#7041] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803091741.CAA05774.keiju@cupmail0.rational.com>

[#7048] Re: infinity — keiju@... (Keiju ISHITSUKA) 1998/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#7049] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7051] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#7054] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7050] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803100359.MAA08628.keiju@cupmail0.rational.com>

[#7259] Socket#shutdown — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

16 messages 1998/03/28
[#7260] Re: Socket#shutdown — matz@... (Yukihiro Matsumoto) 1998/03/28

まつもと ゆきひろです

[#7265] Re: Socket#shutdown — keiju@... (石塚圭樹 ) 1998/03/29

けいじゅ@日本ラショナルソフトウェアです.

[ruby-list:6890] date class

From: Tadayoshi Funaba <tadf@...>
Date: 1998-03-02 10:48:21 UTC
List: ruby-list #6890
ふなばです。

もうひとつのデイトクラスかもしれない、ダテクラスを紹介します。

基本的な設計は lib/date.rb を踏襲しています。暦計算法は Meeus の式を採用
しました。Meeus の著書をみたいと思いましたが、このためにわざわざ取り寄せ
るのもなんなので、まだみてません。ふたつの暦の混在のさせかたは Oberon の
ためのライブラリ、Michael Griebling さんの JulianDay.Mod が参考になりまし
た。この JulianDay.Mod が Meeus の式をつかっていて、これを翻訳してみよう
かとも考えましたが、設計が気にいらないのでやめました。

ダテクラスの特徴

lib/date.rb では改暦日が固定になっていましたが (英国におけるそれ)、ダテク
ラスは自由に設定することができます。デフォルトではグレゴリオ暦を世界で最
初に導入した日 (1582年10月15日) になっています。

さほど利用価値はないかもしれませんが、ダテクラスでは紀元前の日付もあつか
えます。

lib/date.rb のインスタンスは年月日をもつようにしていますが、ダテクラスで
はユリウス日をもつようにしています。クラスのつかわれかたからして、このほ
うが都合がよいように思われるからです。ダテ#new はユリウス日をとるようにし
て、ダテ#new3 (いい名前が思いつかない) は年月日をとるようにしました。

このユリウス日というのは、ユリウス通日ともいって (Julian period、Julian
day number)、紀元前4713年1月1日 (ユリウス暦) 正午 (グリニッジ平均時) を暦
元 (0.0) とした通日のことです。なお、ダテクラスでは紀元前4713年1月1日を
-4712年1月1日とあらわします。年における通日のことを Julian day number と
称する人々 (技術者だけか?) がいますが、それとは関係がありません。また、ユ
リウス暦 (Julian calendar) とも関係がありません。ちなみに、ユリウス日は考
案者の父親の名前に、ユリウス暦はカエサルの名前に由来します。

ユリウス日は正午より勘定していてますが、ダテクラスにおいては時刻は不要な
ので、素直に正午の勘定をもってその日のユリウス日とすればよいわけです。し
かしながら、Meeus の式では午前零時をもってその日のユリウス日と勘定してお
り、これは端数がついて欝陶しいだけなので、ダテクラスでは正午の勘定をもっ
てその日のユリウス日となるよう修正しています。

過去に置閏法が誤って運用がされたことがありますが、ダテクラスではそういっ
たことは考慮しません。また、年始はいつも1月1日です。

to_s の書式が違っています。メソッド名がちょっと違います。あまり重要そうで
ないメソッドがあったり、なかったりします。

気になるのはダテクラスの信頼性ですが、拙作カレンダーモジュールと800年程突
き合せて検証してみたところ、相違はありませんでした。ちなみに、ダテクラス
とカレンダーモジュールのアルゴリズムはまったく異なるものです。カレンダー
モジュールでは様々なカレンダーをできるだけ統一的にあつかうように考えられ
ています。様々なカレンダーをつかってみたいかたはこちらをお試しください。

ダテクラスについての提案や添削はいつでも歓迎します。

--Tadayoshi Funaba
# date.rb: Written by Tadayoshi Funaba 1998
# $Id: date.rb,v 1.2 1998/03/02 10:02:39 tadf Exp $

class Date

  include Comparable

  MONTHNAMES = [ '', 'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December' ]

  DAYNAMES = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
    'Friday', 'Saturday' ]

  GREGORY = 2299161	# Oct 14, 1582
  ENGLAND = 2361222	# Sept 14, 1752

  def Date.civil_to_jd(y, m, d, gs = true)
    if m <= 2 then
      y -= 1
      m += 12
    end
    a = (y / 100).to_i
    b = (a / 4).to_i
    c = 2 - a + b
    e = (365.25 * (y + 4716)).to_i
    f = (30.6001 * (m + 1)).to_i
    jd = c + d + e + f - 1524
    unless (if gs.kind_of? Numeric then jd >= gs
	    else gs end) then
      jd -= c
    end
    return jd
  end

  def Date.jd_to_civil(jd, gs = true)
    unless (if gs.kind_of? Numeric then jd >= gs
	    else gs end) then
      a = jd
    else
      w = ((jd - 1867216.25) / 36524.25).to_i
      x = (w / 4).to_i
      a = jd + 1 + w - x
    end
    b = a + 1524
    c = ((b - 122.1) / 365.25).to_i
    d = (365.25 * c).to_i
    e = ((b - d) / 30.6001).to_i
    f = (30.6001 * e).to_i
    day = b - d - f
    if e <= 13 then
      m = e - 1
    else
      m = e - 13
    end
    if m <= 2 then
      y = c - 4715
    else
      y = c - 4716
    end
    return y, m, day
  end

  def initialize(jd = 0, gs = GREGORY)
    @jd = jd
    @gs = gs
  end

  def Date.new3(y = -4712, m = 1, d = 1, gs = GREGORY)
    Date.new(Date.civil_to_jd(y, m, d, gs), gs)
  end

  def Date.today
    Date.new3(*Time.now.to_a[3..5].reverse)
  end

  def Date.mjd_to_jd(mjd)
    mjd + 2400000.5
  end

  def Date.jd_to_mjd(jd)
    jd - 2400000.5
  end

  def Date.tjd_to_jd(tjd)
    tjd + 2440000.5
  end

  def Date.jd_to_tjd(jd)
    jd - 2440000.5
  end

  def jd
    @jd
  end

  def mjd
    Date.jd_to_mjd(@jd)
  end

  def tjd
    Date.jd_to_tjd(@jd)
  end

  def year
    Date.jd_to_civil(@jd, @gs)[0]
  end

  def yday
    @jd - Date.civil_to_jd(year - 1, 12, 31, @gs)
  end

  def mon
    Date.jd_to_civil(@jd, @gs)[1]
  end

  def mday
    Date.jd_to_civil(@jd, @gs)[2]
  end

  def wday
    k = (@jd + 1) % 7
    k += 7 if k < 0
    k
  end

  def leap?
    Date.jd_to_civil(Date.civil_to_jd(year, 2, 28, @gs) + 1, @gs)[1] == 2
  end

  def + (other)
    if other.kind_of? Numeric then
      return Date.new(@jd + other, @gs)
    end
    raise TypeError, 'expected numeric'
  end

  def - (other)
    if other.kind_of? Numeric then
      return Date.new(@jd - other, @gs)
    elsif other.kind_of? Date then
      return @jd - other.jd
    end
    raise TypeError, 'expected numeric or date'
  end

  def <=> (other)
    if other.kind_of? Numeric then
      return @jd <=> other
    elsif other.kind_of? Date then
      return @jd <=> other.jd
    end
    raise TypeError, 'expected numeric or date'
  end

  def eql? (other)
    self == other
  end

  def hash
    @jd
  end

  def to_s
    format('%04d-%02d-%02d', *Date.jd_to_civil(@jd, @gs))
  end

end

In This Thread

Prev Next