При преобразовании строки даты ISO 8601 / RFC 3339 в объект NSDate
используется языковой стандарт en_US_POSIX
, если пользователь не использует григорианский календарь. См. Technical Q & amp; A 1480 .
В вашем случае вы пытаетесь получить представление строки года из объекта даты. В этом случае вам может не понадобиться en_US_POSIX
. Это необходимо только в том случае, если вам нужно использовать григорианский календарь независимо от того, какой календарь может использоваться в настоящее время.
Как уже отмечалось другими, вы должны использовать yyyy
, а не YYYY
. Первый возвращает календарный год. Последний возвращает год в календаре на основе «Недели года», который не всегда может быть таким же значением, что и календарный год.
См. Шаблоны форматирования даты для обсуждения, контрастирующего y
и Y
.
Кстати, если вам действительно нужен компонент года в дате, вы также можете использовать связанные с NSDateComponents
методы NSCalendar
.
Вот чем я закончил - Ruby-версия сценария оболочки setenv
:
# Read application config
$hConf, $fConf = {}, File.expand_path("../config.rb", __FILE__)
$hConf = File.open($fConf) {|f| eval(f.read)} if File.exist? $fConf
# Application classpath
$: << ($hConf[:appRoot] || File.expand_path("../bin/app", __FILE__))
# Ruby libs
$lib = ($hConf[:rubyLib] || File.expand_path("../bin/lib", __FILE__))
($: << [$lib]).flatten! # lib is string or array, standardize
Тогда мне просто нужно убедиться, что этот скрипт вызывается один раз, прежде чем что-то еще, и не нужно трогать отдельные исходные файлы.
Я поместил некоторые параметры в конфигурационный файл, например расположение внешних (не gem) библиотек:
# Site- and server specific config - location of DB, tmp files etc.
{
:webRoot => "/srv/www/myapp/data",
:rubyLib => "/somewhere/lib",
:tmpDir => "/tmp/myapp"
}
Это хорошо работает для меня, и я могу повторно использовать сценарий setenv в нескольких проекты просто путем изменения параметров в файле конфигурации. Гораздо лучшая альтернатива, чем сценарии оболочки, IMO.
Начиная с Ruby 1.9, вы можете использовать require_relative , чтобы сделать это:
require_relative '../src/myclass'
Если вам это нужно для более ранних версий, вы можете получить его из гема расширений согласно этот SO комментарий .
Here is a slightly modified way to do it:
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "src"))
By prepending the path to your source to $LOAD_PATH (aka $:) you don't have to supply the root etc. explicitly when you require your code i.e. require 'myclass'
sris's answer is the standard approach.
Another way would be to package your code as a gem. Then rubygems will take care of making sure your library files are in your path.
То же, менее шумное ИМХО:
$:.unshift File.expand_path("../../src", __FILE__)
require 'myclass'
или просто
require File.expand_path "../../src/myclass", __FILE__
Протестировано с ruby 1.8.7 и 1.9.0 на (Debian) Linux - скажите, пожалуйста, работает ли это в Windows, тоже.
Почему более простой метод (например, 'use', 'require_relative' или sg, подобный этому) не встроен в стандартную библиотеку? ОБНОВЛЕНИЕ: require_relative существует с 1.9.x