Android格式日期与时区

时间:2013-01-04 12:47:15

标签: java android calendar google-calendar-api simpledateformat

我需要将日期格式化为特定的字符串。

我使用SimpleDateFormat类使用“ yyyy-MM-dd'T'HH:mm:ssZ ”模式格式化日期,它将当前日期作为
2013-01-04T15:51:45+0530”但我需要as “2013-01-04T15:51:45+05:30”。

以下是使用的编码,

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);      
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));

输出:格式化字符串:2013-01-04T15:51:45+0530

我需要格式为2013-01-04T15:51:45+05:30,只需在gmt time之间添加冒号。

因为我正在Google日历上插入活动,所以它只接受我提到的所需格式。

10 个答案:

答案 0 :(得分:29)

您也可以使用" ZZZZZ"而不是" Z"在你的模式中(根据documentation)。像这样的东西

    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ENGLISH);      
    Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));

答案 1 :(得分:12)

您可以改用Joda Time。其DateTimeFormat具有ZZ格式属性,可以满足您的需求。

Link

大优势:与SimpleDateFormat不同,DateTimeFormatter是线程安全的。用法:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
    .withLocale(Locale.ENGLISH);

答案 2 :(得分:2)

tl;博士

您可以使用模式 yyyy-MM-dd'T'HH:mm:ssXXX 作为您想要的输出。

java.time

java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API

使用现代日期时间 API:

构建一个保存日期、时间和时区偏移信息并设置相同格式的对象:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.of(LocalDate.of(2013, 1, 4), LocalTime.of(15, 51, 45),
                ZoneOffset.ofHoursMinutes(5, 30));

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtf.format(odt));
    }
}

输出:

2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30

如您所见,默认格式的输出与使用 DateTimeFormatter 的输出相同。但是,这里有一个问题:OffsetDateTime#toString 省略 的实现会忽略秒和秒的分数,如果它们是 0 即如果上面代码中的时间是 {{ 1}},默认格式的输出将为 LocalTime.of(15, 0, 0)。如果此时您需要像 2013-01-04T15:00+05:30 这样的字符串,则必须使用具有所需模式的 2013-01-04T15:00:00+05:30

解析和格式化:

DateTimeFormatter

输出:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfForInputString = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2013-01-04T15:51:45+0530", dtfForInputString);

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtfCustomOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtfCustomOutput.format(odt));
    }
}

使用旧 API:

为给定的时区偏移量构建一个日期时间对象并设置相同的格式:

2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30

输出:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+05:30"));
        calendar.set(2013, 0, 4, 15, 51, 45);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        Date date = calendar.getTime();
        System.out.println(sdf.format(date));
    }
}

2013-01-04T15:51:45+05:30 类使用 Calendar(或 UTC)作为其默认时区,因此,除非您指定时区,否则它将返回 GMT 对象java.util.Date

同样,UTC 类也使用 SimpleDateFormat 作为其默认时区,因此,除非您指定时区,否则它将返回相应日期时间的格式化 UTCString

解析和格式化:

UTC

输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdfForInputString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        Date date = sdfForInputString.parse("2013-01-04T15:51:45+0530");

        SimpleDateFormat sdfCustomOutput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdfCustomOutput.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        System.out.println(sdfCustomOutput.format(date));
    }
}

答案 3 :(得分:1)

你可以做的只是使用substring()手动添加“:”。我早些时候已经面对过这个问题了。

答案 4 :(得分:1)

试试这个

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);   

System.out.println("formatted string: "+sdf.format(c.getTime()));

String text = sdf.format(c.getTime());  
String result = text.substring(0, 22) + ":" + text.substring(22);  
System.out.println("result = " + result);

答案 5 :(得分:1)

为什么不用regexp手动执行?

String oldDate = "2013-01-04T15:51:45+0530";
String newDate = oldDate.replaceAll("(\\+\\d\\d)(\\d\\d)", "$1:$2");

相同的结果,带子串(如果性能有问题)。

String oldDate = "2013-01-04T15:51:45+0530";
int length = oldDate.length();
String newDate = oldDate.substring(0, length - 2) + ':' + oldDate.substring(length - 2);

答案 6 :(得分:0)

试试此代码

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.ENGLISH);
String s = sdf.format(c.getTime());
String fDate = s.substring(0, s.length()-2) +":"+s.substring(s.length()-2, s.length());
Log.e("check", "formatted string: "+fDate);

答案 7 :(得分:0)

只需重构此代码并替换' Locale.getDefault()'使用您需要的区域设置

{{1}}

//这是用法

SimpleDateFormat sdf = getDateFormat();

sdf.format(new Date());

答案 8 :(得分:0)

如果您希望日期使用其他timeZone(标题提示)

  val nowMillsUTC = System.currentTimeMillis()

  val timeZoneID = "Australia/Perth"
  val tz = TimeZone.getTimeZone(timeZoneID)

  val simpleDateFormat = SimpleDateFormat("HH.mm  dd.MMM.yyyy", Locale.getDefault())
  simpleDateFormat.setTimeZone(tz)
  val resultTxt = simpleDateFormat.format(nowMillsUTC)

  print(timeZoneID + " -> " + resultTxt)
  //   Australia/Perth -> 19.59  21.Mar.2019

答案 9 :(得分:0)

这就是我在 android Build.VERSION.SDK_INT < 26

上的做法
int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);

当我的服务器发送带有 -3 时区的时间时,我必须将 (3600*3) 添加到 getTime 并将其保存到 utcTime 中,这样 utcTime 就是 UTC。然后我将手机当前时区的偏移量添加到 utcTime。 在我的情况下,因为我的时区是 -3 它的打印:

20:30 12/01/2021

但如果我更改时区,日期也会更改。

我已经在这里回答了: Convert UTC into Local Time on Android