`
polygoncell
  • 浏览: 55354 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

I18N DateFormat, 巧用int干掉if else

阅读更多
DateFormat大家应该都知道,用起来挺麻烦的,要考虑如下问题:

1. I18N
2. 带不带time
3. 如何支持多种不同的Patterns

单单考虑I18N,问题很好好解决,直接调用

public final static DateFormat getDateInstance(int style)


即可获得几个常见的DateFormats。但是怎么添加自己需要的Pattern呢?例如希望英文版的软件支持:“MM/dd/yy”,“MM/dd/yyyy”以及带时间的“MM/dd/yy hh:mm”,“MM/dd/yyyy hh:mm”。直接硬编码当然简单,但是修改起来麻烦,考虑使用Resource Bundles,将日期和时间分开写,各种希望支持的日期Format用分号隔开,例如:

dateformat.date.support = MM/dd/yy;MM/dd/yyyy
dateFormat.time.show = hh:mm


然后在程序里面写循环组合一下。例如:

List<DateFormat> getSupportedFormats(boolean withTime) {
ResourceMap rm = context.getResourceMap(getClass());
		String timeFormat = rm.getString("dateFormat.time.show");
		List<DateFormat> formats = new ArrayList<DateFormat>();
		for (String format : rm.getString("dateformat.date.support").split(";")) {
			formats.add(new SimpleDateFormat(format));
			formats.add(new SimpleDateFormat(format + " "
					+ timeFormat));
		}
		formats.add(DateFormat.getInstance());
		return formats;
}


注意返回的formats中第一个DateFormat会被作为默认的显示Format的使用,这段代码并没用考虑是否显示时间。加上时间判断后,通常使用if else来写:

List<DateFormat> getSupportedFormats(boolean withTime) {
ResourceMap rm = context.getResourceMap(getClass());
		String timeFormat = rm.getString("dateFormat.time.show");
		List<DateFormat> formats = new ArrayList<DateFormat>();
		for (String format : rm.getString("dateformat.date.support").split(";")) {
		  if (withTime) {
                     formats.add(new SimpleDateFormat(format + " "
					+ timeFormat));
                     formats.add(new SimpleDateFormat(format));

                } else {
                     formats.add(new SimpleDateFormat(format));
		     formats.add(new SimpleDateFormat(format + " "
					+ timeFormat));
                  }
		}
		formats.add(DateFormat.getInstance());
		return formats;
}


代码看起来挺痛苦的,有重复,还有我很讨厌的if else,就算是重构一个方法出来也没好到哪里去。考虑用一个int变量踢掉if else,先把resource Bundles里面的dateformat.date.support掉个个,默认显示用的那个Format的放在最后:

dateformat.date.support = MM/dd/yyyy;MM/dd/yy
dateFormat.time.show = hh:mm


代码这么写:

List<DateFormat> getSupportedFormats(boolean withTime) {
		ResourceMap rm = context.getResourceMap(getClass());
		String timeFormat = rm.getString("dateFormat.time.show");
		List<DateFormat> formats = new ArrayList<DateFormat>();
		// withTime = true -> date with time format will be added first. Otherwise 
		// the date format first
		int i = withTime ? 1 : 0;
		formats.add(DateFormat.getInstance());
		for (String format : rm.getString("dateformat.date.support").split(";")) {
			formats.add(i % 2 , new SimpleDateFormat(format));
			formats.add((i + 1) % 2, new SimpleDateFormat(format + " "
					+ timeFormat));
		}
		return formats;
	}


这里利用了对int i 取余以及List集合的add()方法会将老的对象全部向右推的功能,这样处理就可以解决所有问题。根据withTime这个开关,期望的DateFormat会被设定为默认显示的Format。

至此,这个方法:

1. 支持I18N
2. 支持自定义多种Patterns,需要支持新的patterns时,直接在resource bundles里面添加,代码不用改动
3. 支持切换是否显示时间

测试代码如下:

public class FormattedTextFieldFactoryTest {

	private static DateFormatHelper helper;

	@BeforeClass
	public static void init() {
		Locale.setDefault(Locale.US);
		helper = new DateFormatHelper();
	}

	public void addSupportedFormats() {
		List<DateFormat> list = helper.getSupportedFormats(false);
		assertEquals(list.size(), 5);
		assertEquals(list.get(0).format(createDate(2008, 10, 16)),
				"10/16/08");

		list = helper.getSupportedFormats(true);
		assertEquals(list.size(), 5);
		assertEquals(list.get(0).format(createDate(2008, 10, 16)),
				"10/16/08 12:00");
	}

	private Date createDate(int year, int month, int date) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.clear();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DATE, date);
		return cal.getTime();
	}
}
分享到:
评论

相关推荐

    Spring i18n

    Spring i18n,全称为“Spring 国际化”,是Spring框架提供的一个强大的功能,用于支持多语言环境的应用程序开发。它使开发者能够轻松地为不同地区的用户提供本地化的界面和信息,从而提升应用程序的全球适用性。在...

    struts2国际化_i18n

    在开发多语言支持的应用程序时,国际化(i18n)是必不可少的功能。i18n允许应用程序根据用户的地区或语言设置显示相应的文本和格式。 在Struts2中实现国际化,主要涉及到以下几个关键知识点: 1. **资源包...

    Java的i18n问题解决文档,代码

    Java的国际化(i18n)是指开发能够适应不同语言和文化环境的程序,以满足全球用户的需求。Java提供了强大的支持来处理i18n问题,主要涉及以下几个关键知识点: 1. **Locale类**: Locale类是Java中处理地区和语言...

    flutter_i18n_2021:示例项目显示了使用新的i18n Flutter方法的基本设置

    在本文中,我们将深入探讨如何在Flutter应用中实现国际化(i18n)功能,特别是基于`flutter_i18n`库的2021年新方法。`flutter_i18n`是一个流行的开源库,它简化了Flutter应用程序的多语言支持。我们将详细解释其基本...

    I18N本地化

    Java的I18N(Internationalization)本地化是软件开发中的一个重要概念,它涉及如何让应用程序适应不同国家和地区,提供符合当地语言、文化习惯和格式的用户体验。在本教程中,我们将深入探讨Java中实现I18N的步骤、...

    i18-n-3.5.0.jar.rar

    标题中的“i18-n-3.5.0.jar.rar”是一个压缩文件,通常用于存储多个文件或目录,便于传输和归档。这里的".rar"是RAR格式,它是一种流行的压缩格式,由RARLAB开发,提供了高效的数据压缩和修复功能。 描述中提到...

    DateFormat_Dateformat_

    因此,国际化(I18N)和本地化(L10N)的程序会使用特定的库或API来自动适应用户的地区设置。 总的来说,日期格式化是一个涉及编程语言特性、标准、用户界面设计和文化差异的多方面话题。在实际编程中,正确地处理日期...

    javaI18N[国际化]

    Java I18N(国际化)是Java平台提供的一项重要功能,它使得开发的软件能够适应全球不同地区的语言和文化环境。I18N这个术语来源于“Internationalization”,其中“I”和“N”之间有18个字母,因此简称为I18N。Java...

    DateFormat

    调用该类中的方法,实现字符串于日期类型之间的转换,以及包括数据库中的日期类型,避免了代码的重复.

    jquery-dateFormat, 使用JavaScript格式化日期输出的jQuery插件.zip

    jquery-dateFormat, 使用JavaScript格式化日期输出的jQuery插件 使用JavaScript格式输出日期输出的jQuery dateformat插件- 拥有的,jQuery是最小的日期格式库。 ! 安装下载最新的jquery.dateFormat.js 或者 jquery....

    java 使用DateFormat类获取系统的当前时间

    下面将详细介绍如何使用 `DateFormat` 类来获取并格式化系统当前时间。 首先,我们需要了解 `java.util.Date` 类,它是表示特定瞬间的时间值,精确到毫秒。`DateFormat` 类通常与 `Date` 类一起使用,用来将 `Date`...

    Java DateFormat并发实现

    然而,`DateFormat`并不是线程安全的,这意味着在多线程环境中直接使用可能会导致数据不一致或者异常。这篇博客文章《Java DateFormat并发实现》探讨了这个问题以及如何在并发环境下正确地使用`DateFormat`。 `...

    java使用DateFormat类转换时间格式.docx

    ### Java使用DateFormat类转换时间格式 #### 一、引言 在Java编程中,处理日期与时间是非常常见的需求之一。`java.util`包中的`DateFormat`类提供了多种方法来格式化日期并将其转换为字符串,或者将字符串解析为...

    dateformatjs一个超轻量级的JS日期处理库

    dateFormat.i18n.monthNames = ['一月', '二月', '三月', ...]; // 设置中文月份名称 ``` ### 4. 动态格式化 除了静态的日期格式,`dateformat.js` 还允许动态格式化。例如,可以根据当前日期与给定日期的差异,...

    Node.js-dateformat-一个优秀的node.js日期格化包

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。在 Node.js 开发中,处理日期和时间是常见的任务,`dateformat` 模块就是一个非常实用的工具,专为 ...

    js的日历时间控件

    if(this.options.timePicker&&this.options.datePicker){this.options.currentFormat=this.options.dateTimeFormat}else{if(this.options.timePicker){this.options.currentFormat=this.options.timeFormat}else{...

    sql-dateformat.rar_DateFormat_datEformat SQL_sql中dateformat_时间格式

    总的来说,`DATEFORMAT`在SQL中的使用依赖于你所使用的具体数据库系统。理解不同数据库对日期时间格式化的不同处理方式是确保查询正确性的关键。同时,处理日期和时间数据时应确保日期格式的一致性,尤其是在数据...

    DateFormat_1.0.0.jar

    使用方法: DateFormatManager dateformat = new DateFormatManager( new char[] { DateString.CENTURY, DateString.MONTH, DateString.DAY, DateString.YEAR, DateString.WEEK, DateString.HOUR_OF_DAY, Date...

    dateFormat:日期格式

    6. **本地化**:`dateFormat`库还支持国际化的日期格式,通过设置`i18n`对象,可以适应不同的语言环境。 7. **自定义格式**:你还可以创建自定义的格式模板,以满足特定的需求。例如,如果你想输出中文日期格式,...

    前端项目-jquery-dateFormat.zip

    在实际应用中,`jquery-dateFormat` 可以与AJAX请求配合使用,将服务器返回的日期字符串转换为用户友好的格式。同时,它也可以用于处理表单输入验证,确保用户输入的日期符合预设的格式。 总结来说,`jquery-...

Global site tag (gtag.js) - Google Analytics