在java 8中将日期转换为EST

时间:2017-12-26 06:54:01

标签: java

我试图将日期转换为以下时区,但结果并不像预期的那样 - 我得到的要求就是说例如从 PMST 转换为 EST 输出应该少2小时。

PMST, NST, AST, 美东时间, CST, MST, 太平洋标准时间, 农业知识与科技, HAST

String inputDate = "2017/04/30 08:10";
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
LocalDateTime local = LocalDateTime.parse(inputDate, sourceFormatter);
ZonedDateTime zoned = local.atZone(TimeZone.getTimeZone("PMST").toZoneId());
ZonedDateTime requiredZone = zoned.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId());
System.out.println(requiredZone);
  

输出 - 2017-04-30T03:10-05:00

3 个答案:

答案 0 :(得分:2)

所以你知道你的输入"本地日期"在PMST时区。

config :my_app, MyApp.Endpoint,
  live_reload: [
    patterns: [
      ~r{../coherence/lib/.*(ex)$}, # THIS

      ~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$},
      ~r{priv/gettext/.*(po)$},
      ~r{lib/ammotion_web/views/.*(ex)$},
      ~r{lib/ammotion_web/templates/.*(eex)$}
    ]
  ]

但您应该注意到上述内容并未包含您所知道的时区信息。因此,您需要将该信息添加到String。

但我们现在所拥有的仅仅是String localDateTimeString = "2017/04/30 08:10"; ,所以首先我们必须决定我们将使用的日期时间格式,并且必须知道TimeZone,

String

此处,DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm Z"); 表示TimeZone偏移量。我们知道ZPMST,因此我们需要将此信息添加到我们的本地时间字符串中,

UTC-0300

现在,我们可以使用日期时间格式器

来阅读它
String dateTimeString = "2017/04/30 08:10" + " -0300";

而且,现在我们可以在任何我们想要的时区获取日期,

ZonedDateTime dateTimeInPMST = ZonedDateTime.parse(dateTimeString, dateTimeWithZoneFormatter);

编辑1 ::

获取时区的偏移量(比如说ZonedDateTime dateTimeInEST = dateTimeInPMST.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId());

EST

请注意int offsetInSeconds = TimeZone.getTimeZone("EST").getRawOffset() / 1000; ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offsetInSeconds); String zoneOffsetString = zoneOffset.toString(); // "-05:30" 中的这个:,我们必须更改-05:30以适应此情况,

DateTimeFormat

现在,您可以将其添加到任何dateTimeString,

DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm ZZZ");

答案 1 :(得分:0)

这对我有用。修改需要哪个区域。

public class ZonedDateTime {

    private static final String DATE_FORMAT = "dd/M/yyyy hh:mm:ss a";

    public static void main(String[] args) {

        String dateInString = "26/12/2017 10:15:55 AM";
        LocalDateTime ldt = LocalDateTime.parse(dateInString, DateTimeFormatter.ofPattern(DATE_FORMAT));

        ZoneId newYokZoneId = ZoneId.of("America/New_York");
        ZonedDateTime nyDateTime =ldt.atZone(newYokZoneId);
        System.out.println("Date (New York) : " + nyDateTime);

        DateTimeFormatter format = DateTimeFormatter.ofPattern(DATE_FORMAT);
        System.out.println("Date (New York) : " + format.format(nyDateTime));

    }

}

使用此功能查找所有区域。

TreeSet<String> sortedZones = new TreeSet<>(ZoneId.getAvailableZoneIds());

    for (String zone : sortedZones) {
            System.out.println(zone);
    }

答案 2 :(得分:0)

避免使用伪区域

切勿使用媒体中常见的3-4个字母缩写,例如var musiclist = [MusicList]() var player : AVPlayer? var playerItem : AVPlayerItem? var playButton : UIButton? var isClicked : Bool = false var songPostion : NSInteger = 0 var someValue : NSInteger = 0 var getsongPostion : NSInteger = 0 var getSongUrl : String? var getArtistName : String? var getSongName : String? func playFunc(){ if getSongIndex.arrayurl.count > getsongPostion{ centerButton.isHidden = true playButton?.isHidden = true pauseButton.isHidden = false let url = URL(string: getSongIndex.arrayurl[getsongPostion]) let playerItem:AVPlayerItem = AVPlayerItem(url: url!) player = AVPlayer(playerItem: playerItem) if player?.rate == 0 { player!.play() } else { player!.pause() } songName.text = getSongIndex.arraysongname[getsongPostion] artistName.text = getSongIndex.arrayartistname[getsongPostion] } } CSTIST。这些不是真正的时区,没有标准化,甚至不是唯一的(!)。

真实时区:EST

相反,确定您想要的真实时区。 continent/region格式为continent/region,例如America/MontrealAfrica/Casablanca以及Pacific/Auckland

更改您的输入以符合ISO 8601标准格式。

String input = "2017/04/30 08:10".replace( " " , "T" ) ;

解析为LocalDateTime,因为您的输入缺少从UTC或时区偏移的指示符。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

如果您确定要用于此输入,请应用时区。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.withZoneSameInstant( z ) ;