Class: Persian::Date

Inherits:
Object
  • Object
show all
Defined in:
lib/persian/date.rb

Overview

Persian count class Basic counters for persian chars, texts, sentences and paragraphs

Instance Method Summary collapse

Instance Method Details

#d2g(jdn) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/persian/date.rb', line 121

def d2g(jdn)
  j = 4 * jdn + 139_361_631
  j = j + div(div(4 * jdn + 183_187_720, 146_097) * 3, 4) * 4 - 3_908
  i = div(mod(j, 1_461), 4) * 5 + 308
  gd = div(mod(i, 153), 5) + 1
  gm = mod(div(i, 153), 12) + 1
  gy = div(j, 1_461) - 100_100 + div(8 - gm, 6)

  { gy: gy,
    gm: gm,
    gd: gd }
end

#d2j(jdn) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/persian/date.rb', line 80

def d2j(jdn)
  gy = d2g(jdn)[:gy]
  jy = gy - 621
  r = jal_cal(jy)
  jdn1f = g2d(gy, 3, r[:march])

  k = jdn - jdn1f
  if k >= 0
    (
    if k <= 185
      jm = 1 + div(k, 31)
      jd = mod(k, 31) + 1
      return {
        jy: jy,
        jm: jm,
        jd: jd
      }
    else
      k -= 186
    end
    )
  else
    jy -= 1
    k += 179
    k += 1 if r[:leap] == 1
  end
  jm = 7 + div(k, 30)
  jd = mod(k, 30) + 1

  {
    jy: jy,
    jm: jm,
    jd: jd
  }
end

#div(a, b) ⇒ Object



134
135
136
# File 'lib/persian/date.rb', line 134

def div(a, b)
  tilde(a / b.to_f)
end

#g2d(gy, gm, gd) ⇒ Object



116
117
118
119
# File 'lib/persian/date.rb', line 116

def g2d(gy, gm, gd)
  d = div((gy + div(gm - 8, 6) + 100_100) * 1_461, 4) + div(153 * mod(gm + 9, 12) + 2, 5) + gd - 34_840_408
  d - div(div(gy + 100_100 + div(gm - 8, 6), 100) * 3, 4) + 752
end

#j2d(jy, jm, jd) ⇒ Object



75
76
77
78
# File 'lib/persian/date.rb', line 75

def j2d(jy, jm, jd)
  r = jal_cal(jy)
  g2d(r[:gy], 3, r[:march]) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1
end

#jal_cal(jy) ⇒ Object

Raises:

  • (Error)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/persian/date.rb', line 31

def jal_cal(jy)
  breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
            1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178]

  bl = breaks.size
  gy = jy + 621
  leap_j = -14
  jp = breaks[0]

  raise Error if jy < jp || jy >= breaks[bl - 1]

  jump = nil

  1.upto(bl - 1) do |i|
    jm = breaks[i]
    jump = jm - jp

    break if jy < jm

    leap_j = leap_j + div(jump, 33) * 8 + div(mod(jump, 33), 4)
    jp = jm
  end

  n = jy - jp

  leap_j = leap_j + div(n, 33) * 8 + div(mod(n, 33), 4)

  leap_j += 1 if mod(jump, 33) == 4 && jump - n == 4

  leap_g = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150

  march = 20 + leap_j - leap_g

  n = n - jump + div(jump + 4, 33) * 33 if jump - n < 6

  leap = mod(mod(n + 1, 33) - 1, 4)

  leap = 4 if leap == -1

  { leap: leap,
    gy: gy,
    march: march }
end

#jalali_month_length(jy, jm) ⇒ Object



24
25
26
27
28
29
# File 'lib/persian/date.rb', line 24

def jalali_month_length(jy, jm)
  return 31 if jm <= 6
  return 30 if jm <= 11
  return 30 if leap_jalali_year?(jy)
  29
end

#leap_jalali_year?(jy) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/persian/date.rb', line 20

def leap_jalali_year?(jy)
  jal_cal(jy)[:leap].zero?
end

#mod(a, b) ⇒ Object



138
139
140
# File 'lib/persian/date.rb', line 138

def mod(a, b)
  a - tilde(a / b.to_f) * b
end

#tilde(num) ⇒ Object



142
143
144
145
146
147
148
# File 'lib/persian/date.rb', line 142

def tilde(num)
  if num < 0
    num.ceil
  else
    num.floor
  end
end

#to_gregorian(jy, jm, jd) ⇒ Object



12
13
14
# File 'lib/persian/date.rb', line 12

def to_gregorian(jy, jm, jd)
  d2g(j2d(jy, jm, jd))
end

#to_jalali(gy, gm, gd) ⇒ Object



8
9
10
# File 'lib/persian/date.rb', line 8

def to_jalali(gy, gm, gd)
  d2j(g2d(gy, gm, gd))
end

#valid_jalali_date?(jy, jm, jd) ⇒ Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/persian/date.rb', line 16

def valid_jalali_date?(jy, jm, jd)
  jy >= -61 && jy <= 3177 && jm >= 1 && jm <= 12 && jd >= 1 && jd <= jalali_month_length(jy, jm)
end