MoonPhase.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import math, decimal, datetime
  4. def position(time=None):
  5. dec = decimal.Decimal
  6. if time is None:
  7. time = datetime.datetime.now()
  8. diff = time - datetime.datetime(2001, 1, 1)
  9. days = dec(diff.days) + (dec(diff.seconds) / dec(86400))
  10. lunations = dec("0.20439731") + (days * dec("0.03386319269"))
  11. return lunations % dec(1)
  12. def phase(pos = None, time = None) -> dict:
  13. if time is None:
  14. time = datetime.datetime.now()
  15. if pos is None:
  16. pos = position(time)
  17. dec = decimal.Decimal
  18. index = (pos * dec(8)) + dec("0.5")
  19. index = math.floor(index)
  20. return {
  21. "index" : index,
  22. "phase" : int(index) & 7,
  23. "pos" : pos,
  24. "name" : {
  25. 0: "New Moon",
  26. 1: "Waxing Crescent",
  27. 2: "First Quarter",
  28. 3: "Waxing Gibbous",
  29. 4: "Full Moon",
  30. 5: "Waning Gibbous",
  31. 6: "Last Quarter",
  32. 7: "Waning Crescent"
  33. }[int(index) & 7]
  34. }