diff --git a/features/permalinks.feature b/features/permalinks.feature index ca0482fce90..a69e059bf94 100644 --- a/features/permalinks.feature +++ b/features/permalinks.feature @@ -71,14 +71,14 @@ Feature: Fancy permalinks And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html" Scenario: Use custom permalink schema with date and time - Given I have a _posts directory + Given I have a configuration file with: + | key | value | + | permalink | "/:year:month:day:hour:minute:second.html" | + | timezone | UTC | + And I have a _posts directory And I have the following post: | title | category | date | content | | Custom Permalink Schema | stuff | 2009-03-27 22:31:07 | Totally custom. | - And I have a configuration file with: - | key | value | - | permalink | "/:year:month:day:hour:minute:second.html" | - | timezone | UTC | When I run jekyll build Then I should get a zero exit status And the _site directory should exist diff --git a/features/step_definitions.rb b/features/step_definitions.rb index c69cc0891d3..f4e80e770d9 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -4,6 +4,7 @@ FileUtils.rm_rf(Paths.test_dir) if Paths.test_dir.exist? FileUtils.mkdir_p(Paths.test_dir) unless Paths.test_dir.directory? Dir.chdir(Paths.test_dir) + @timezone_before_scenario = ENV["TZ"] end # @@ -13,6 +14,7 @@ Paths.output_file.delete if Paths.output_file.exist? Paths.status_file.delete if Paths.status_file.exist? Dir.chdir(Paths.test_dir.parent) + ENV["TZ"] = @timezone_before_scenario end # @@ -85,6 +87,7 @@ if status == "post" parsed_date = Time.xmlschema(input_hash["date"]) rescue Time.parse(input_hash["date"]) + input_hash["date"] = parsed_date filename = "#{parsed_date.strftime("%Y-%m-%d")}-#{title}.#{ext}" end @@ -116,6 +119,7 @@ {} end config[key] = YAML.load(value) + Jekyll.set_timezone(value) if key == "timezone" File.write("_config.yml", YAML.dump(config)) end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 1eb8418605e..f7a05a12d0f 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -426,7 +426,7 @@ def merge_categories!(other) private def merge_date!(source) - if data.key?("date") && !data["date"].is_a?(Time) + if data.key?("date") data["date"] = Utils.parse_date( data["date"].to_s, "Document '#{relative_path}' does not have a valid date in the #{source}." diff --git a/test/source/_dates/date_without_time.md b/test/source/_dates/date_without_time.md new file mode 100644 index 00000000000..7e5ee003808 --- /dev/null +++ b/test/source/_dates/date_without_time.md @@ -0,0 +1,4 @@ +--- +date: 2015-10-01 +--- +Here is the content. diff --git a/test/source/_dates/time_with_timezone.md b/test/source/_dates/time_with_timezone.md new file mode 100644 index 00000000000..5a7c9277bc0 --- /dev/null +++ b/test/source/_dates/time_with_timezone.md @@ -0,0 +1,4 @@ +--- +date: 2015-10-01 01:00:00 +0800 +--- +Here is the content. diff --git a/test/source/_dates/time_without_timezone.md b/test/source/_dates/time_without_timezone.md new file mode 100644 index 00000000000..ae0423e10cb --- /dev/null +++ b/test/source/_dates/time_without_timezone.md @@ -0,0 +1,4 @@ +--- +date: 2015-10-01 01:00:00 +--- +Here is the content. diff --git a/test/test_document.rb b/test/test_document.rb index 6ce71230680..213271c8b87 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -16,6 +16,19 @@ def setup_encoded_document(filename) }).tap(&:read) end + def setup_document_with_dates(filename) + site = fixture_site("collections" => ["dates"]) + site.process + docs = nil + with_env("TZ", "UTC") do + docs = Document.new(site.in_source_dir(File.join("_dates", filename)), { + :site => site, + :collection => site.collections["dates"], + }).tap(&:read) + end + docs + end + context "a document in a collection" do setup do @site = fixture_site({ @@ -558,4 +571,34 @@ def setup_encoded_document(filename) Jekyll::Renderer.new(@document.site, @document).render_document end end + + context "a document with a date with timezone" do + setup do + @document = setup_document_with_dates "time_with_timezone.md" + end + + should "have the expected date" do + assert_equal "2015/09/30", @document.data["date"].strftime("%Y/%m/%d") + end + end + + context "a document with a date with time but without timezone" do + setup do + @document = setup_document_with_dates "time_without_timezone.md" + end + + should "have the expected date" do + assert_equal "2015/10/01", @document.data["date"].strftime("%Y/%m/%d") + end + end + + context "a document with a date without time" do + setup do + @document = setup_document_with_dates "date_without_time.md" + end + + should "have the expected date" do + assert_equal "2015/10/01", @document.data["date"].strftime("%Y/%m/%d") + end + end end