npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fuzzy_date

v0.0.7

Published

A 3-byte data type flexible in modeling date.

Downloads

1

Readme

TL;DR

A 3-bytes data type for historical and general purpose date modeling:

| Fuzzy Date | How to Input | |------------------|--------------| | December | d-12 | | December 25 | d-12-25 | | 1024 BC | 1024BC | | 212 BC | 212BC | | August 212 BC | 212BC-8 | | August 6, 212 BC | 212BC-8-6 | | ? 24 BC | ?24BC | | ? c. 20 BC | ?c.20BC | | 10s BC - 0s BC | 10sBC+10 | | 10s BC - 0s AD | 10sBC+20 | | 0s BC | 0sBC | | 0s BC - 0s AD | 0sBC+10 | | c. 9 BC - 7 BC | c.9BC+2 | | c. 9 BC - 12 AD | c.9BC+20 | | 1 BC | 1BC | | 1 BC - 1 AD | 1BC+1 | | 0s | 0s | | 1 | 1 | | 2010s | 2010s | | 2010s - 2020s | 2010s+10 | | 2014 | 2014 | | January 2014 | 2014-1 | | January 1, 2014 | 2014-1-1 | | 2014 - 2015 | 2014+1 | | 3071 | 3071 |

and more.

The Long Version

Most data types dealing with date are designed to represent a certain date with varying ranges (usually starts from 1, 1753, 1900, or 1970) and accuracies (usually from 100 nanoseconds to 1 day).

Below examples are common seen in historical and general purpose writings:

  • 2014 (year only)
  • January 2014 (year and month only)
  • 252 BC (before Christ)
  • 1950s (one decade)
  • 1966 - 1976 (spanning 10 years)
  • circa 1791 (around a certain year)
  • ? January 16, 1078 (uncertain date)

None of above can be stored or processed using existing data types. We do not consider String as an option since it's:

  1. storage inefficient
  2. hard to sort
  3. hard to localize

Fuzzy Date proposes:

  1. a 3-byte data type flexible in modeling date
  2. a set of functions dealing with above format

Binary Format

The binary format aims to be:

  1. storage efficient
  2. sortable

3 bytes are used to store a fuzzy date:

[8Y]  [4Y][4M]  [5D][A][B][C]
  • 12 Year Bits:

The 1st byte and top 4 bits of the 2nd byte are year bits. Total space of:

2 ^ 12 = 4096

The mapping between 12 year bits and the actual year is:

  • 0b000000000000 represents a fuzzy date without a year part, e.g.:

    • February (month only)
    • February 1 (month and day only)
    • February 29 (all possible days of a month)
  • substract 1024 for all other combos, we get a year within:

    • 1024 BC (0b000000000001 - 1024 = -1023) and
    • 3071 AD (0b111111111111 - 1024 = 3071)
  • 4 Month Bits:

    • 0b0000 represents a decade (day bits should be 0b00000) or a fuzzy date spanning multi-decades, e.g.:

      • 1860s
      • 1860s - 1870s

      For BC decades, the year is the start year of the decades, e.g.:

      • The year bits for 10s BC are same as 19 BC (-18).
    • 0b0001 represents a fuzzy date with only a year part (day bits should be 0b00000), e.g.:

      • 1790
    • 0b1110 is reserved which should not be used in the current spec version.

    • 0b1111 represents a fuzzy date spanning multiple years, e.g.:

      • 1791+2 (day bits denote year span, from 1 to 32)
    • substract 1 for all other combos, we get a month within:

      • 1 (0b0010 - 1) and
      • 12 (0b1101 - 1)
  • 5 Day Bits:

When month bits are 0b1111, day bits denote year span, otherwise:

  • 0b00000 represents a fuzzy date without a day part, e.g.:

    • January 1791
  • 0b00001 to 0b11111 represents day 1 to day 31 accordingly.

  • Flag Bit A: Certainty.

    • 1: the date is certain

    • 0: the date is uncertain, e.g.:

      • ? 1791
      • ? January 1791
  • Flag Bit B: Accuracy.

    • 1: the date is accurate

    • 0: the date is approximate, e.g.:

      • circa 1791
      • circa January 1791
  • Flag Bit C: Special flag. ICMD use flag bit C to denote floruit:

    • 1: the fuzzy date is not a floruit date

    • 0: the fuzzy date is not a floruit date, e.g.:

      • fl. 1234

An application can define its own usage for flag bit C. Keep it 1 when you don't need it.

Uncertain/approximate dates go before certain/accurate dates in ascending order (default for print). Thus, all flag bits are 1 by default.

Helper Functions

  • is_valid_binary: Check if a binary is a valid fuzzy date binary.
  • binary_from_string: Parse a short string into a fuzzy date binary.
  • string_from_binary: Parse a fuzzy date binary into a short string.
  • readable_string_from_binary: Parse a fuzzy date binary into a readable (en-us) string.

binary_from_string and string_from_binary are mutually inverse functions.

More Functions

  • year_of : Return the year part of a fuzzy date, null when inapplicable.
  • month_of : Return the month part of a fuzzy date, null when inapplicable.
  • day_of : Return the day part of a fuzzy date, null when inapplicable.
  • year_diff : Return the difference in years between two fuzzy dates, null when inapplicable.

Obsolete

  • fuzzy_date_2_markup: Return markuped date (for navigation use):
  • fuzzy_date_2_julian_markup: Return markuped Julian date (for navigation use).

Data Polish

  1. 1 BC before 1 AD, no 0 AD.
  2. Year span 1 to 32, not 0 to 31.